home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Games / Starter / JST / Developer / sources / OSEmu / osemu.asm < prev    next >
Encoding:
Assembly Source File  |  1999-12-03  |  72.8 KB  |  3,516 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    osemu.asm
  3. ;  :Author.    Harry, Wepl
  4. ;  :RCS.    $Id: osemu.asm 1.1 1999/02/03 04:10:48 jotd Exp jotd $
  5. ;  :History.    all work before history starts done by Harry
  6. ;    30.06.98   Wepl     rework started
  7. ;    06.07.98   Wepl     rework finished
  8. ;    07.07.98   Wepl     exec.Supervisor,exec.SuperState,exec.UserState
  9. ;                    exec.FindTask,exec.FindPort,exec.OpenDevice
  10. ;                    graphics.alot,exec.DoIO
  11. ;    15.07.98   Wepl     work for Deuteros finished
  12. ;    31.07.1998 Harry    SSP set on memtop again as it is in kick1.3
  13. ;                possibility of trainer routine added
  14. ;    10.08.98   Wepl     osemu header struct changed (SLAVETRAINER now
  15. ;                in osemu-struct instead overgiven via reg)
  16. ;    10.08.98   Wepl     gfx.BltBitMap fixed
  17. ;    ??.08.98   MrLarmer some additions
  18. ;    05.09.98   Wepl     AddIntServer/RemIntServer finally fixed
  19. ;                ReadPixel,WritePixel added
  20. ;    06.09.98   Wepl     return values after init changed (bootblock)
  21. ;                BltTemplate started (but unfinished)
  22. ;    22.09.98   Wepl     _SendIO is now the same as _DoIO (fix for Deuteros)
  23. ;    27.09.98   Harry    dos.lock (untested), device-names even-
  24. ;                aligned (68000-prob), (usp) initialized 
  25. ;                with stacksize (CC3 expects it in 4(usp) at
  26. ;                start), dummy: dos.input+dos.output+
  27. ;                exec.waitport
  28. ;    29.09.1998 Harry    list management functions implemented: 
  29. ;                exec.insert, exec.(add|rem)(head|tail), exec.remove
  30. ;    07.10.1998 Harry    list handling debugged, libs as list, one process
  31. ;                structure, exec.findtask changed, _initlibary
  32. ;                splittet, exec.getmsg, dos.deviceproc, intuition.
  33. ;                openwindow, intuition.closewindow, icon.library,
  34. ;                intuition.cleardmrequest, dos.unloadseg, 
  35. ;                minor fixes
  36. ;    11.10.1998 Harry    devices as list, dos.loadseg supports hunk_symbol,
  37. ;                audio.device-dummy, gfx.allocraster, gfx.freeraster,
  38. ;                gfx.bltclear, gfx.initbitmap (and #fe), intuition.
  39. ;                lockibase dummy, layers.library, mathffp.library,
  40. ;                trackdisk.device-msgport, execlib-table implemented
  41. ;                directly, exec.copymem, exec.findname, minor fixes
  42. ;    19.10.1998 Harry    dos.examine, dos.unlock, exec.setintvector,
  43. ;                audio-interrupts, gfx.getcolormap
  44. ;    20.10.1998 Harry    gfx.set(a|b)pen, gfx.setdrmd, gfx.initrastport,
  45. ;                topaz.font-replacement, gfx.openfont, gfx.setfont,
  46. ;                some gfx-structures
  47. ;    24.10.1998 Harry    gfx.text, some debugging, exec.allocsignal, 
  48. ;                gfx.move, problem with input.addhandler, 
  49. ;                exec.availmem keeps now a reserve of $1000, 
  50. ;                gfx.freecolormap
  51. ;    31.10.98   Wepl     input.device fixed, color handling changed 
  52. ;                (getcolormap,freecolormap,loadrgb4,initview,
  53. ;                initvport,makevport,loadview,setrgb4,getsprite,
  54. ;                freesprite,movesprite,changesprite,vbi
  55. ;    03.11.98   Wepl     bug in AllocMem fixed (size rounded up now)
  56. ;    25.11.1998 Harry    switched back to old gfx-viewport-stuff,
  57. ;                gfx.loadview(0)
  58. ;       30.11.1998 MrLarmer exec.(create|delete)(iorequest|msgport),
  59. ;                exec.freesignal, exec.allocsignal changed
  60. ;    01.12.1998 Harry    libs in osemu extended to V40 (as i dont have 
  61. ;                3.1-includes working with asm-one do not have 
  62. ;                the idea to replace the values by labels,
  63. ;                ill change them back!), exec.exitintr
  64. ;       05.12.1998 Harry    some debugging, list handling debugged again,
  65. ;                           exec.allocmem:MEMF_LARGEST dummy, MEMF_REVERSE
  66. ;                dummy, exec.setsignal, dos.currentdir, 
  67. ;                dos.waitforchar, execbase.vblankfrequency,
  68. ;                dos.duplock
  69. ;    09.01.1999 JOTD     bugfix in DoIO() return code (D0). "implemented"
  70. ;                           CMD_UPDATE (does nothing) and CMD_CLEAR
  71. ;    09.01.1999 JOTD     improved CloseWorkbench() intuition call
  72. ;                           Now returns 0 only once, and then 1
  73. ;                           Led Storm does not lock anymore now
  74. ;       10.01.1999 JOTD     added AlohaWorkbench() intuition call (dummy)
  75. ;                           added WaitBOFVP() (not accurate)
  76. ;                           added CloseScreen() (dummy)
  77. ;       14.01.1999 JOTD     added dos.library Info() function
  78. ;                           (for Flashback)
  79. ;       15.01.1999 JOTD     added D0=0 return codes in input.device
  80. ;       15.01.1999 JOTD     added lowlevel.library, nonvolatile.library
  81. ;                           added cd.device and freeanim.library (dummies)
  82. ;                           added exec CheckIO
  83. ;                           improved DoIO (dummy support of cd.device,cdtv.device)
  84. ;                           added WaitIO (dummy support of cd.device,cdtv.device)
  85. ;                           added SetFunction (for Banshee, now intro OK)
  86. ;       30.01.1999 JOTD     added keyboard.device (not complete)
  87. ;                           installed a default empty copperlist to avoid problems
  88. ;                           with JST
  89. ;       02.02.1999 JOTD     added complete lowlevel.library ReadJoyPort() function
  90. ;                           using function keys (F1-F5) for joypad extra buttons
  91. ;                           DoIO/SendIO: if device is not found, then return with
  92. ;                           no error (dummy for cd.device)
  93. ;                           Oscar CD32 now works perfectly!
  94. ;       18.03.1999 MrLarmer keyboard.device improved
  95. ;                       FreeSignal improved
  96. ;
  97. ;       30.03.1999 JOTD     Added graphics.library InitTmpRas, InitArea
  98. ;       01.04.1999 JOTD     Added mathffp.library SPFlt,SPDiv (removed
  99. ;                           from intuition.s)
  100. ;       01.04.1999 JOTD     Added mathtrans.library SPATan (untested)
  101. ;       17.04.1999 JOTD     Dummy console.device added
  102. ;       19.05.1999 JOTD     Added CMD_WRITE to trackdisk DoIO (for ArcadePool)
  103. ;                           Added dummy entry for nonvolatile StoreEnv
  104. ;                           Added items in the OSEmu structure for use with JST
  105. ;                           Added OSEmu ID, version/release and version string
  106. ;                           Added whdmacros.i include for v10 WHDLoad .i files
  107. ;       26.05.1999 JOTD     Added EntryType to FileInfoBlock structure
  108. ;                           (Sensible Soccer CD32 v1.2 needed 2 $FFFF in struct
  109. ;                           to get hold of the filesize, the bastards!)
  110. ;       08.06.1999 JOTD     Added fastmemory support, debug entry (HRTMon)
  111. ;                           Added flush cache after LoadSeg() succeeded (v1.4)
  112. ;       11.06.1999 JOTD     Corrected LoadSeg() to allocate hunks in chip/fast (v1.5)
  113. ;    26.06.1999 JOTD     Added dummy AssignPath()
  114. ;                           Added disk.resource OpenResource() (no functions yet)
  115. ;                           Fixed a bug in Examine if not found (FreeMem problem)
  116. ;                           Added ExamineFH (SlamTilt)
  117. ;                           Added AllocRemember/FreeRemember (SlamTilt)
  118. ;       10.08.1999 JOTD     Added dummy disk.resource GetUnit()
  119. ;                           Added AllocEntry/FreeEntry (on Bored Seal request) (v1.7)
  120. ;       24.09.1999 JOTD     Bugfixed DupLock() (v1.8)
  121. ;
  122. ;    Note:    - does not run with JumpingJackSon because 
  123. ;          it expects an old bug in dos.LoadSeg (APTR instead BPTR)
  124. ;        - with Deuteros and Millenium2·2 the mouse poiner is invisible
  125. ;          now (broken graphics clist stuff)
  126. ;
  127. ;  :Copyright.    GPL
  128. ;  :Language.    68000 Assembler
  129. ;  :Translator.    Asm-One V1.30 R399, Barfly V2.9, Asm-Pro V1.12, Devpac V3.14
  130. ;---------------------------------------------------------------------------*
  131. ; Currently emulated functions:
  132. ;    exec.library
  133. ;        _LVOAddHead
  134. ;        _LVOAddIntServer    ;partial
  135. ;        _LVOAddPort        ;dummy !
  136. ;        _LVOAddTail
  137. ;        _LVOAllocAbs
  138. ;        _LVOAllocMem
  139. ;        _LVOAllocSignal
  140. ;        _LVOAvailMem
  141. ;        _LVOCloseDevice        ;dummy
  142. ;        _LVOCloseLibrary    ;dummy
  143. ;        _LVOCopyMem        ;not optimized
  144. ;        _LVODisable
  145. ;        _LVODoIO        ;some of trackdisk/input
  146. ;        _LVOEnable
  147. ;        _LVOExitIntr        ;experimentally
  148. ;        _LVOFindName
  149. ;        _LVOFindTask        ;partially
  150. ;        _LVOForbid        ;dummy
  151. ;        _LVOFreeMem
  152. ;        _LVOGetMsg        ;dummy
  153. ;        _LVOInsert
  154. ;        _LVOOldOpenLibrary
  155. ;        _LVOOpenDevice        ;only trackdisk/input !
  156. ;        _LVOOpenLibrary
  157. ;        _LVOOpenResource
  158. ;        _LVOPermit        ;dummy
  159. ;        _LVORemove
  160. ;        _LVORemHead
  161. ;        _LVORemIntServer
  162. ;        _LVORemPort        ;dummy
  163. ;        _LVORemTail
  164. ;        _LVOSendIO        ;only input !
  165. ;        _LVOSetIntVector    ;only audiointerrupts
  166. ;        _LVOSetSignal
  167. ;        _LVOSuperState        ;exact v39
  168. ;        _LVOSupervisor
  169. ;        _LVOUserState        ;exact v39
  170. ;    dos.library
  171. ;        _LVOClose
  172. ;        _LVOCurrentDir        ;returns always 0 for rootdir
  173. ;        _LVODeviceProc        ;dummy
  174. ;        _LVODupLock        ;limited to files and null for rootdir
  175. ;        _LVOExamine        ;doesnt work for dirs atm, only files and volumes
  176. ;        _LVOInput        ;dummy
  177. ;        _LVOLoadSeg
  178. ;        _LVOLock        ;atm no dirs, only files and volumes
  179. ;        _LVOOpen
  180. ;        _LVOOutput        ;dummy
  181. ;        _LVORead
  182. ;        _LVOSeek
  183. ;        _LVOUnLoadSeg
  184. ;        _LVOUnLock        ;internal the same as dos.close
  185. ;        _LVOWaitForChar        ;atm dummy, will be implemented
  186. ;        _LVOWrite
  187. ;    graphics.library
  188. ;        _LVOAllocRaster
  189. ;        _LVOBltBitMap        ;has still some limitations !
  190. ;        _LVOBltClear        ;with CPU
  191. ;        _LVOBltTemplate        ;broken
  192. ;        _LVODisownBlitter    ;dummy
  193. ;        _LVOChangeSprite
  194. ;        _LVODraw        ;dummy !
  195. ;        _LVOFreeColorMap
  196. ;        _LVOFreeRaster
  197. ;        _LVOFreeSprite
  198. ;        _LVOGetColorMap
  199. ;        _LVOGetSprite
  200. ;        _LVOInitBitMap
  201. ;        _LVOInitRastPort
  202. ;        _LVOInitView        ;dummy !
  203. ;        _LVOInitVPort        ;dummy !
  204. ;        _LVOLoadView        ;sets copperlist
  205. ;        _LVOLoadRGB4        ;sets colors immediate
  206. ;        _LVOMakeVPort        ;builds copperlist
  207. ;        _LVOMove
  208. ;        _LVOMoveSprite
  209. ;        _LVOMrgCop
  210. ;        _LVOOwnBlitter        ;dummy
  211. ;        _LVOReadPixel
  212. ;        _LVOSetAPen
  213. ;        _LVOSetBPen
  214. ;        _LVOSetDrMd
  215. ;        _LVOSetRGB4        ;sets color immediate
  216. ;        _LVOText
  217. ;        _LVOVBeamPos
  218. ;        _LVOWaitBlit
  219. ;        _LVOWaitTOF
  220. ;        _LVOWritePixel
  221. ;    intuition.library
  222. ;        _LVOClearDMRequest    ;dummy
  223. ;        _LVOCloseWindow        ;rudimentary
  224. ;        _LVOCloseWorkbench
  225. ;        _LVOOpenWindow        ;rudimentary
  226. ;    ciaa.resource,ciab.resource
  227. ;        _LVOAddICRVector
  228. ;        _LVORemICRVector
  229. ;    icon.library
  230. ;    layers.library
  231. ;    mathffp.library
  232. ;    mathtrans.library
  233. ;---------------------------------------------------------------------------*
  234. ; programs using this stuff:
  235. ;    AnotherWorld (WHDLoad), Bombuzal (WHDLoad), Castle Master (WHDLoad),
  236. ;       Crazy Cars 3 (WHDLoad), Deuteros (WHDLoad), JumpingJackSon (WHDLoad), 
  237. ;       Lionheart (WHDLoad), North&South (WHDLoad), Son Of Stag series (JST),
  238. ;       Street Fighter 1 (JST), Flashback (JST), Oscar CD32 (JST),
  239. ;       Metal Mutant, Colorado, Flink CD32 (WHDLoad), Sensible Soccer CD32 (JST)
  240. ;       Bubble Bobble (JST), Arcade Pool (JST), Shadow Fighter CD32 (JST)
  241. ;
  242. ; unfinished:
  243. ;    Millenium 2·2, Lords of War (works until title), 
  244. ;       Pushover (no keyboard - dos.waitforchar),
  245. ;    Prehistorik (gfx.MrgCop must be improved),
  246. ;       Black Tiger (JST) (works until title), Led Storm (JST) (no gfx in game),
  247. ;    Imperium (JST)
  248. ;---------------------------------------------------------------------------*
  249. ; ToDo:
  250. ;    rewriting memory management for less memory waste
  251. ;    implement dos.waitforchar fully: allow open to raw:, read characters,
  252. ;      close
  253. ;    support nonexisting files in dos.lib
  254. ;
  255. ;---------------------------------------------------------------------------*
  256. ; How to use in WHDLoad:
  257. ;
  258. ;    ;load the osemu module
  259. ;        lea    (_osemu,pc),a0        ;filename of the osemu module
  260. ;        lea    ($400.w),a1        ;the address on which you have
  261. ;                        ;assembled the osemu module
  262. ;        move.l    (_resload,pc),a2    ;the resload base
  263. ;        jsr    (resload_LoadFileDecrunch,a2)    ;this allows to
  264. ;                        ;compress the osemu
  265. ;    ;init the osemu module
  266. ;                        ;system stack has to be on 
  267. ;                        ;top of memory (automatically
  268. ;                        ;done by whdload)
  269. ;        move.l    (_resload,pc),a0    ;the resload base
  270. ;        lea    (_base,pc),a1        ;the slave structure
  271. ;        jsr    $400
  272. ;
  273. ;    ;start the program
  274. ;        move    #0,sr            ;if the program uses the os it
  275. ;                        ;should executed in user mode
  276. ;
  277. ;    ;if you want to add a trainer use this, to setup a routine which will
  278. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  279. ;        lea    (_trainer,pc),a0
  280. ;        move.l    a0,($404.w)
  281. ;    ;if you want to use fast memory:
  282. ;        lea    (_base,pc),a1        ;the slave structure
  283. ;        move.l    (ws_ExpMem,A1),($424.w)
  284. ;        move.l    #<expmem size>,($428.w)
  285. ;
  286. ;---------------------------------------------------------------------------*
  287.  
  288. ;---------------------------------------------------------------------------*
  289. ; How to use in JST:
  290. ;
  291. ;    ;allocate expansion memory if needed
  292. ;
  293. ;    move.l    #$100000,D0    ; 1meg
  294. ;    JSRABS    AllocExtMem
  295. ;
  296. ;    ;load the osemu module (when the OS is active)
  297. ;
  298. ;    JSRABS    UseHarryOSEmu
  299. ;
  300. ;    ;start the program
  301. ;
  302. ;    GO_SUPERVISOR
  303. ;    SAVE_OSDATA    xxxx            ; classical OS-kill call
  304. ;
  305. ;    move    #0,sr            ;if the program uses the os it
  306. ;                    ;should executed in user mode
  307. ;                    ;but it's seldom necessary
  308. ;
  309. ;    ;if you want to add a trainer use this, to setup a routine which will
  310. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  311. ;        lea    (_trainer,pc),a0
  312. ;        move.l    a0,$400+OSM_SLVTRAINER
  313. ;
  314. ;---------------------------------------------------------------------------*
  315.  
  316.     INCLUDE    whoami.i            ;this contains only a symbol
  317.  
  318.     IFD HARRY                ;(asm-one)
  319.         INCDIR    ASM-ONE:INCLUDE2.0/
  320.         INCLUDE LIBRARIES/DOS_LIB.I
  321.         INCLUDE    LIBRARIES/DOS.I
  322.         INCLUDE    DEVICES/INPUT.I
  323.         INCLUDE    DEVICES/KEYBOARD.I
  324.         INCLUDE    DEVICES/TRACKDISK.I
  325.         INCLUDE    DOS/DOSEXTENS.I
  326.         INCLUDE    DOS/DOSHUNKS.i
  327.         INCLUDE RESOURCES/CIA_LIB.I
  328.         INCLUDE EXEC/EXEC_LIB.I
  329.         INCLUDE    EXEC/MEMORY.I
  330.         INCLUDE    EXEC/TASKS.I
  331.         INCLUDE    GRAPHICS/GRAPHICS_LIB.I
  332.         INCLUDE    GRAPHICS/LAYERS_LIB.I
  333.         INCLUDE    GRAPHICS/GFXBASE.I
  334.         INCLUDE    GRAPHICS/DISPLAYINFO.I
  335.         INCLUDE    GRAPHICS/SPRITE.I
  336.         INCLUDE    HARDWARE/CUSTOM.I
  337.         INCLUDE INTUITION/INTUITION_LIB.I
  338.         INCLUDE INTUITION/INTUITION.I
  339.         INCLUDE    MATH/MATHFFP_LIB.I
  340.         INCLUDE    OWN/CCRMAKRO
  341.         INCLUDE    OWN/WHDLOAD.I
  342.         INCLUDE    WORKBENCH/ICON_LIB.I
  343.         INCDIR    ASM-ONE:OWN/PATCHER/OSEMU/
  344.     org    $400
  345.     load    $100000
  346.     ENDC
  347.     IFD WEPL                ;(barfly)
  348.         INCDIR    Includes:
  349.         INCLUDE    devices/input.i
  350.         INCLUDE    devices/inputevent.i
  351.         INCLUDE    devices/trackdisk.i
  352.         INCLUDE    devices/keyboard.I
  353.         INCLUDE    dos/dos.i
  354.         INCLUDE    dos/doshunks.i
  355.         INCLUDE    dos/dosextens.i
  356.         INCLUDE    exec/memory.i
  357.         INCLUDE    exec/tasks.i
  358.         INCLUDE    graphics/gfx.i
  359.         INCLUDE    graphics/gfxbase.i
  360.         INCLUDE    graphics/rastport.i
  361.         INCLUDE    graphics/sprite.i
  362.         INCLUDE    graphics/view.i
  363.         INCLUDE    intuition/intuition.i
  364.         INCLUDE    lvo/cia.i
  365.         INCLUDE    lvo/dos.i
  366.         INCLUDE    lvo/exec.i
  367.         INCLUDE    lvo/graphics.i
  368.         INCLUDE    lvo/icon.i
  369.         INCLUDE    lvo/intuition.i
  370.         INCLUDE    lvo/layers.i
  371.         INCLUDE    lvo/mathffp.i
  372.         INCLUDE    lvo/mathtrans.i
  373.         INCLUDE    whdload.i
  374.         INCLUDE    whdmacros.i    ; added for WHDLoad v10 includes
  375.  
  376.         IFD BARFLY
  377.         BOPT    O+ OG+            ;enable optimizing
  378.         BOPT    ODd- ODe-        ;disable mul optimizing
  379.         BOPT    w4-            ;disable 64k warnings
  380.         SUPER                ;disable supervisor warnings
  381.         ENDC
  382.  
  383.         ORG    $400
  384.         OUTPUT    OSEmu.400
  385.         ;OUTPUT    wart:a/anotherworld/osemumodule400.bin
  386.         ;OUTPUT    wart:b/bombuzal/osemumodule400.bin
  387.         ;OUTPUT    wart:d-f/deuteros/OSEmu.400
  388.         ;OUTPUT    wart:h-j/jumpingjackson/osemumodule400.bin
  389.         ;OUTPUT    wart:m/millennium2·2/OSEmu.400
  390.         ;OUTPUT    wart:n-p/north&south/OSEmu.400
  391.     ENDC
  392.  
  393.     IFD JOTD                ;(phxass/barfly)
  394.         INCDIR    include:
  395.         INCLUDE    "LVOs.i"
  396.         INCLUDE    "jst_libs.i"
  397.         INCLUDE    "dos/doshunks.i"
  398.         INCLUDE "devices/trackdisk.i"
  399.         INCLUDE "devices/input.i"
  400.         INCLUDE    "devices/keyboard.I"
  401.         INCLUDE "devices/inputevent.i"
  402.         INCLUDE "exec/interrupts.i"
  403.         INCLUDE    "graphics/gfx.i"
  404.         INCLUDE    "graphics/gfxbase.i"
  405.         INCLUDE    "graphics/rastport.i"
  406.         INCLUDE    "graphics/sprite.i"
  407.         INCLUDE    "graphics/view.i"
  408.         INCLUDE    "intuition/intuition.i"
  409.         INCLUDE    "libraries/lowlevel.i"
  410.         INCLUDE    "libraries/nonvolatile.i"
  411.  
  412.         INCLUDE    "whdload.i"
  413.         INCLUDE    "whdmacros.i"    ; added for WHDLoad v10 includes
  414.  
  415.         IFD BARFLY
  416.         BOPT    O+ OG+            ;enable optimizing
  417.         BOPT    ODd- ODe-        ;disable mul optimizing
  418.         BOPT    w4-            ;disable 64k warnings
  419.         BOPT    wo-            ;disable optimizer warnings
  420.         SUPER                ;disable supervisor warnings
  421.         ENDC
  422.  
  423.         ORG    $400
  424.         OUTPUT    C:OSEmu.400
  425.  
  426.     ENDC
  427.  
  428.     IFD MR.LARMER                ;(devpac)
  429.         INCDIR    Include:
  430.         INCLUDE    devices/input.i
  431.         INCLUDE    devices/inputevent.i
  432.         INCLUDE    devices/keyboard.i
  433.         INCLUDE    devices/trackdisk.i
  434.         INCLUDE    dos/dos.i
  435.         INCLUDE    dos/doshunks.i
  436.         INCLUDE    dos/dosextens.i
  437.         INCLUDE    exec/memory.i
  438.         INCLUDE    graphics/gfx.i
  439.         INCLUDE    graphics/gfxbase.i
  440.         INCLUDE    graphics/rastport.i
  441.         INCLUDE    graphics/sprite.i
  442.         INCLUDE    graphics/view.i
  443.         INCLUDE    intuition/intuition.i
  444.         INCLUDE    libraries/lowlevel.i
  445.         INCLUDE    libraries/nonvolatile.i
  446.         INCLUDE    lvo/cia_lib.i
  447.         INCLUDE    lvo/dos_lib.i
  448.         INCLUDE    lvo/exec_lib.i
  449.         INCLUDE    lvo/graphics_lib.i
  450.         INCLUDE    lvo/icon_lib.i
  451.         INCLUDE    lvo/intuition_lib.i
  452.         INCLUDE    lvo/layers_lib.i
  453.         INCLUDE    lvo/lowlevel_lib.i
  454.         INCLUDE    lvo/mathffp_lib.i
  455.         INCLUDE    lvo/mathtrans_lib.i
  456. ;        INCLUDE    lvo/nonvolatile_lib.i
  457.         INCLUDE    whdload.i
  458.  
  459.         OPT    O+ OG+            ;enable optimizing
  460.         OPT    P=68020
  461.  
  462.         ORG    $400
  463.         OUTPUT    OSEmu.400
  464.     ENDC
  465.  
  466. USPLENGTH=$2000        ;reserved area for USP, enlarge if necessary
  467.  
  468. CORRECTDEVICES=1    ;if set 0, module will be assembled with
  469.             ;cut-down devices (no list connection, no
  470.             ;msgport of td.dev, no library-like device-
  471.             ;structure)
  472.  
  473. ; config bits for JST
  474. ; (WHDLoad has got its tags, why JST cannot have its ones :))
  475.  
  476. AFB_NTSC = 0
  477. AFB_NOOSSWAP = 4
  478.  
  479. ;---------------------------------------------------------------------------*
  480. **************************************************************************
  481. *   INITIALIZATION CALL                                                  *
  482. **************************************************************************
  483.  
  484.         bra    _Init
  485.         CNOP 0,4    ;essential for correct OSEmu-Structure !
  486.  
  487. **************************************************************************
  488. *   GLOBAL VARIABLES                                                     *
  489. **************************************************************************
  490.  
  491. ;-------------------------------------------------------------------------
  492. ; the following data are part of the OSEmu structure, the offsets of these
  493. ; data are guaranteed to remain unchanged for all future versions
  494.  
  495. ; v1.8
  496. VERSION = 1
  497. RELEASE = 8
  498.  
  499. OSM_SLVTRAINER    DC.L    0    ;OSEmu-Offset = 4
  500. OSM_LASTLOADSEG    dc.l    0    ;OSEmu-Offset = 8
  501. OSM_ID        dc.b    "OSEM"    ;OSEmu-Offset = 12 : added by JOTD
  502. OSM_VER        dc.w    VERSION    ;OSEmu-Offset = 16 : ""
  503.         dc.w    RELEASE    ;OSEmu-Offset = 18 : ""
  504. OSM_COPPERADDR    dc.l    0    ;OSEmu-Offset = 20 : "" 
  505. OSM_ICONIFYCODE    dc.l    0    ;OSEmu-Offset = 24 : ""
  506. OSM_ICONIFYKEY    dc.l    0    ;OSEmu-Offset = 28 : ""
  507. OSM_JSTFLAGS    dc.l    0    ;OSEmu-Offset = 32 : ""
  508. OSM_EXPMEM    dc.l    0    ;OSEmu-Offset = 36 : ""
  509. OSM_EXPSIZE    dc.l    0    ;OSEmu-Offset = 40 : ""
  510. OSM_DEBUGENTRY    dc.l    0    ;OSEmu-Offset = 44 : ""
  511.         dc.l    0,0,0,0,0,0,0,0    ; future use
  512. ; version string
  513.  
  514.     dc.b    "$VER: OSEmu v",VERSION+'0',".",RELEASE+'0',0
  515.     cnop    0,4
  516.  
  517. ;-------------------------------------------------------------------------
  518.  
  519. ALLOCMTABSIZE    DC.L    0        ; chip memory
  520. ALLOCFASTMTABSIZE    DC.L    0    ; fast memory
  521. _Slave        dc.l    0
  522. _RESLOAD    dc.l    0
  523. _dosbase    dc.l    0
  524. _gfxbase    dc.l    0
  525. _intbase    dc.l    0
  526. _ilibbase    dc.l    0
  527. _laybase    dc.l    0
  528. _mffpbase    dc.l    0
  529. _mtrbase    dc.l    0    ; added by JOTD
  530. _lowlbase    dc.l    0    ; added by JOTD
  531. _franbase    dc.l    0    ; added by JOTD
  532. _nonvbase    dc.l    0    ; added by JOTD
  533. _diskbase    dc.l    0    ; added by JOTD
  534. _ciaabase    dc.l    0
  535. _ciabbase    dc.l    0
  536. _inputhandler    dc.l    0            ;input.device handler (interrupt server structure)
  537. _inputevent    ds.b    ie_SIZEOF
  538. _tags        dc.l    WHDLTAG_ATTNFLAGS_GET
  539.         dc.w    0
  540. _attnflags    dc.w    0
  541.         dc.l    WHDLTAG_ECLOCKFREQ_GET
  542. _eclockfreq    dc.l    0
  543.         dc.l    WHDLTAG_MONITOR_GET
  544. _monitor    dc.l    0
  545.         dc.l    WHDLTAG_CHIPREVBITS_GET
  546. _chiprev    dc.l    0
  547.         dc.l    WHDLTAG_Private3
  548. _p3        dc.l    0
  549.         dc.l    0
  550.  
  551. _libtable    dc.l    _dosname,DOSINIT
  552.         dc.l    _gfxname,GFXINIT
  553.         dc.l    _intname,INTUIINIT
  554.         dc.l    _execname,EXEC2INIT
  555.         dc.l    _ilibname,ILIBINIT
  556.         dc.l    _layname,LAYERSINIT
  557.         dc.l    _mffpname,MATHFFPINIT
  558.         dc.l    _lowlname,LOWLINIT
  559.         dc.l    _franname,FRANINIT
  560.         dc.l    _mtrname,MATHTRANSINIT
  561.         dc.l    _nonvname,NONVINIT
  562.         dc.l    0
  563. _restable    dc.l    _ciaaname,CIAAINIT
  564.         dc.l    _ciabname,CIABINIT
  565.         dc.l    _diskname,DISKINIT
  566.         dc.l    0
  567.  
  568. _devtable
  569. _tddevtable    DC.L    _tdname,0
  570. _inpdevtable    DC.L    _inpname,0
  571. _auddevtable    DC.L    _audname,0
  572. _cddevtable    DC.L    _cdname,0
  573. _cdtvdevtable    DC.L    _cdtvname,0
  574. _kbdevtable    DC.L    _kbdevname,0
  575. _condevtable    DC.L    _condevname,0
  576.         DC.L    0
  577.  
  578. ; added by JOTD
  579. sec_timer:
  580.     dc.l    0
  581. millisec_timer:
  582.     dc.l    0
  583.  
  584. _last_joy0dat    dc.w    0
  585.  
  586. _sprites    ds.l    8
  587.  
  588. KBDVAL        DC.B    0
  589. _last_lmb    dc.b    0
  590. _last_rmb    dc.b    0
  591.  
  592. _mffpname    dc.b    'mathffp.library',0
  593. _layname    dc.b    'layers.library',0
  594. _ilibname    dc.b    'icon.library',0
  595. _execname    dc.b    "exec.library",0
  596. _dosname    dc.b    "dos.library",0
  597. _gfxname    dc.b    "graphics.library",0
  598. _intname    dc.b    "intuition.library",0
  599. _lowlname    dc.b    "lowlevel.library",0    ; added by JOTD
  600. _franname    dc.b    "freeanim.library",0    ; added by JOTD
  601. _nonvname    dc.b    "nonvolatile.library",0    ; added by JOTD
  602. _mtrname    dc.b    "mathtrans.library",0    ; added by JOTD
  603. _ciaaname    dc.b    "ciaa.resource",0
  604. _ciabname    dc.b    "ciab.resource",0
  605. _diskname    dc.b    "disk.resource",0
  606.     EVEN
  607. _tdname        dc.b    'trackdisk.device',0
  608.     EVEN
  609. _inpname    dc.b    'input.device',0
  610.     EVEN
  611. _audname    dc.b    'audio.device',0
  612.     EVEN
  613. _cdname        dc.b    'cd.device',0
  614.     EVEN
  615. _cdtvname    dc.b    'cdtv.device',0
  616.     EVEN
  617. _kbdevname    dc.b    'keyboard.device',0
  618.     EVEN
  619. _condevname    dc.b    'console.device',0
  620.     EVEN
  621.  
  622. ;task gets a process structure
  623.  
  624. _EXECLIBTASK    DC.L    0
  625.         DC.L    0
  626.         DC.B    NT_TASK
  627.         DC.B    0
  628.         DC.L    _execname
  629.         DC.B    0
  630.         DC.B    TS_RUN
  631.         DC.B    0
  632.         DC.B    0
  633.         DC.L    0        ;TC_SIGALLOC
  634.         DC.L    0
  635.         DC.L    0
  636.         DC.L    0
  637.         DC.W    0
  638.         DC.W    0
  639.         DC.L    0
  640.         DC.L    0
  641.         DC.L    0
  642.         DC.L    0
  643.         DC.L    0
  644.         DC.L    0
  645.         DC.L    0
  646.         DC.L    0
  647.         DC.L    0
  648.  
  649.         DC.L    0
  650.         DC.L    0
  651.         DC.L    0
  652.         DC.B    0
  653.         DC.B    0
  654.  
  655.         DC.L    0
  656.  
  657. _EXECLIBMSGPORT    DC.L    0        ;MUST FOLLOW DIRECTLY TO TASK
  658.         DC.L    0        ;CC3 EXPECTS THAT SO
  659.         DC.B    NT_MSGPORT
  660.         DC.B    0
  661.         DC.L    0
  662.  
  663.         DC.B    PA_SIGNAL
  664.         DC.B    0        ;BIT 0 AS SIGNALBIT
  665.         DC.L    _EXECLIBTASK
  666.  
  667.         DC.L    0        ;NO MESSAGES YET
  668.         DC.L    0
  669.         DC.L    0
  670.         DC.B    NT_MESSAGE
  671.         DC.B    0
  672.  
  673.  
  674.         DC.W    0
  675.         DC.L    $EEEEEEEE    ;INVALID SEGLIST
  676.         DC.L    USPLENGTH-$20
  677.         DC.L    $EEEEEEEC    ;INVALID GLOBVEC
  678.         DC.L    1
  679.         DC.L    0
  680.         DC.L    0
  681.         DC.L    $EEEEEEEA
  682.         DC.L    0
  683.         DC.L    0
  684.         DC.L    $EEEEEEEE
  685.         DC.L    $EEEEEEEE
  686. _bcplcorrect1    DC.L    _CLI
  687.         DC.L    $EEEEEEEE
  688.         DC.L    0
  689.         DC.L    -1
  690. _EXECLIBPROCESS_SIZEOF
  691.  
  692.     IFNE    _EXECLIBMSGPORT-_EXECLIBTASK-$5C
  693.     FAIL
  694.     ENDC
  695.  
  696.     IFNE    _EXECLIBPROCESS_SIZEOF-_EXECLIBTASK-$BC
  697.     FAIL
  698.     ENDC
  699.  
  700.  
  701.     CNOP    0,4
  702. _CLI        DC.L    0
  703.         DC.L    $EEEEEEE
  704.         DC.L    $EEEEEEE
  705.         DC.L    0
  706. _bcplcorrect2    DC.L    _ANIMNAME
  707.         DC.L    20
  708.         DC.L    $EEEEEEE
  709.         DC.L    $EEEEEEE
  710.         DC.L    $EEEEEEE
  711.         DC.L    $EEEEEEE
  712.         DC.L    0
  713.         DC.L    0
  714.         DC.L    $EEEEEEE
  715.         DC.L    USPLENGTH-$20
  716.         DC.L    $EEEEEEE
  717.         DC.L    $EEEEEEE
  718.  
  719.     CNOP    0,4
  720. _ANIMNAME    DC.B    8,'df0:anim',0
  721.  
  722.     EVEN
  723.  
  724. _EXECMINSIZE
  725.  
  726.     DS.B    822        ;-_LVOExecReserved08
  727.  
  728. _EXECLIBBASE
  729.     DC.L    _LIBLIST+4
  730.     DC.L    _LIBLIST
  731.     DC.B    NT_LIBRARY
  732.     DC.B    0
  733.     DC.L    _execname
  734.                     ;end of node structure
  735.     DC.B    4
  736.     DC.B    $EE
  737.     DC.W    -_LVOCopyMemQuick
  738.     DC.W    $24C
  739.     DC.W    $28            ;version of exec.lib=KS3.1
  740.     DC.W    $0A            ;subversion
  741.     DC.L    $EEEEEEEE
  742.     DC.L    $EEEEEEEE
  743.     DC.W    0
  744.                     ;end of library structure
  745.     DC.W    $44            ;version: KS3.1
  746.     DC.W    $EEEE
  747.     DC.L    $EEEEEEEE
  748.     DC.L    $EEEEEEEE
  749.     DC.L    $EEEEEEEE
  750.     DC.L    $EEEEEEEE
  751.     DC.L    0
  752.     DC.L    0
  753.     DC.L    0
  754.     DC.L    0
  755.     DC.L    0
  756.     DC.L    $EEEEEEEE
  757.     DC.L    0
  758.     DC.W    $EEEE    
  759.  
  760.     DC.L    $DDDDDDDD
  761.     DC.L    $DDDDDDDD
  762.     DC.L    $DDDDDDDD
  763.  
  764.     DC.L    $DDDDDDDD
  765.     DC.L    $DDDDDDDD
  766.     DC.L    $DDDDDDDD
  767.  
  768.     DC.L    $DDDDDDDD
  769.     DC.L    $DDDDDDDD
  770.     DC.L    $DDDDDDDD
  771.  
  772.     DC.L    $DDDDDDDD
  773.     DC.L    $DDDDDDDD
  774.     DC.L    $DDDDDDDD
  775.  
  776.     DC.L    $DDDDDDDD
  777.     DC.L    $DDDDDDDD
  778.     DC.L    $DDDDDDDD
  779.  
  780.     DC.L    $DDDDDDDD
  781.     DC.L    $DDDDDDDD
  782.     DC.L    $DDDDDDDD
  783.  
  784.     DC.L    $DDDDDDDD
  785.     DC.L    $DDDDDDDD
  786.     DC.L    $DDDDDDDD
  787.  
  788.     DC.L    $DDDDDDDD
  789.     DC.L    $DDDDDDDD
  790.     DC.L    $DDDDDDDD
  791.  
  792.     DC.L    $DDDDDDDD
  793.     DC.L    $DDDDDDDD
  794.     DC.L    $DDDDDDDD
  795.  
  796.     DC.L    $DDDDDDDD
  797.     DC.L    $DDDDDDDD
  798.     DC.L    $DDDDDDDD
  799.  
  800.     DC.L    $DDDDDDDD
  801.     DC.L    $DDDDDDDD
  802.     DC.L    $DDDDDDDD
  803.  
  804.     DC.L    $DDDDDDDD
  805.     DC.L    $DDDDDDDD
  806.     DC.L    $DDDDDDDD
  807.  
  808.     DC.L    $DDDDDDDD
  809.     DC.L    $DDDDDDDD
  810.     DC.L    $DDDDDDDD
  811.  
  812.     DC.L    $DDDDDDDD
  813.     DC.L    $DDDDDDDD
  814.     DC.L    $DDDDDDDD
  815.  
  816.     DC.L    $DDDDDDDD
  817.     DC.L    $DDDDDDDD
  818.     DC.L    $DDDDDDDD
  819.  
  820.     DC.L    $DDDDDDDD
  821.     DC.L    $DDDDDDDD
  822.     DC.L    $DDDDDDDD
  823.  
  824.     DC.L    _EXECLIBTASK
  825.     DC.L    $EEEEEEEE
  826.     DC.L    $EEEEEEEE
  827.     DC.W    $EEEE
  828.     DC.W    $DDDD
  829.     DC.W    $EEEE
  830.     DC.B    -1
  831.     DC.B    -1
  832.     DC.W    0
  833.     DC.W    $EEEE
  834.     DC.L    $EEEEEEEE
  835.     DC.L    $EEEEEEEE
  836.     DC.L    $EEEEEEEE
  837.     DC.L    $EEEEEEEE
  838.     DC.L    $EEEEEEEE        ;DUMMY, NORMALLY ALLOCATED SIGNALS
  839.     DC.W    $EEEE
  840.  
  841.     DC.L    $EEEEEEEE
  842.     DC.L    $EEEEEEEE
  843.     DC.L    $EEEEEEEE
  844.     DC.W    $EEEE
  845.  
  846.     DC.L    $EEEEEEEE
  847.     DC.L    $EEEEEEEE
  848.     DC.L    $EEEEEEEE
  849.     DC.W    $EEEE
  850.  
  851.     IFNE    CORRECTDEVICES
  852. _DEVLISTC    DC.L    _DEVLISTC+4
  853.         DC.L    0
  854.         DC.L    _DEVLISTC
  855.         DC.B    NT_DEVICE
  856.         DC.B    0
  857.     ELSE
  858.         DC.L    $EEEEEEEE        ;DEVICELIST
  859.         DC.L    $EEEEEEEE
  860.         DC.L    $EEEEEEEE
  861.         DC.W    $EEEE
  862.     ENDC
  863.  
  864.     DC.L    $EEEEEEEE
  865.     DC.L    $EEEEEEEE
  866.     DC.L    $EEEEEEEE
  867.     DC.W    $EEEE
  868.  
  869. _LIBLIST    DC.L    _EXECLIBBASE
  870.         DC.L    0
  871.         DC.L    _EXECLIBBASE
  872.         DC.B    NT_LIBRARY
  873.         DC.B    0
  874.  
  875.     DC.L    $EEEEEEEE
  876.     DC.L    $EEEEEEEE
  877.     DC.L    $EEEEEEEE
  878.     DC.W    $EEEE
  879.  
  880. _TASKREADYLIST    DC.L    _TASKREADYLIST+4
  881.         DC.L    0
  882.         DC.L    _TASKREADYLIST
  883.         DC.B    NT_TASK
  884.         DC.B    0
  885.  
  886.     DC.L    $EEEEEEEE
  887.     DC.L    $EEEEEEEE
  888.     DC.L    $EEEEEEEE
  889.     DC.W    $EEEE
  890.  
  891.     DC.L    $EEEEEEEE
  892.     DC.L    $EEEEEEEE
  893.     DC.L    $EEEEEEEE
  894.     DC.L    $EEEEEEEE
  895.  
  896.     DC.L    $EEEEEEEE
  897.     DC.L    $EEEEEEEE
  898.     DC.L    $EEEEEEEE
  899.     DC.L    $EEEEEEEE
  900.  
  901.     DC.L    $EEEEEEEE
  902.     DC.L    $EEEEEEEE
  903.     DC.L    $EEEEEEEE
  904.     DC.L    $EEEEEEEE
  905.  
  906.     DC.L    $EEEEEEEE
  907.     DC.L    $EEEEEEEE
  908.     DC.L    $EEEEEEEE
  909.     DC.L    $EEEEEEEE
  910.  
  911.     DC.L    $EEEEEEEE
  912.     DC.L    $EEEEEEEE
  913.     DC.L    $EEEEEEEE
  914.     DC.L    $EEEEEEEE
  915.  
  916.     DC.L    $EEEEEEEE
  917.     DC.L    $EEEEEEEE
  918.     DC.L    $EEEEEEEE
  919.     DC.L    $EEEEEEEE
  920.  
  921.     DC.B    $EE            ;VBLANK FREQU
  922.     DC.B    $EE            ;POWER SUPPLY FREQU
  923.     
  924.     DC.L    $EEEEEEEE
  925.     DC.L    $EEEEEEEE
  926.     DC.L    $EEEEEEEE
  927.     DC.W    $EEEE
  928.  
  929.     DC.L    $EEEEEEEE
  930.     DC.L    $EEEEEEEE
  931.     DC.W    $EEEE
  932.  
  933.     DS.B    12
  934.     DS.B    20
  935.     DS.B    $2C
  936. _EMAXSIZE
  937.  
  938.     IFNE    _EMAXSIZE-_EXECLIBBASE-$278
  939.     FAIL
  940.     ENDC
  941.  
  942.  
  943.     IFNE    CORRECTDEVICES
  944. _TDDMSGPORT
  945.     DC.L    0
  946.     DC.L    0
  947.     DC.B    NT_MSGPORT
  948.     DC.B    0
  949.     DC.L    _tdname
  950.  
  951.     dc.b    0
  952.     dc.b    0
  953.     DC.L    _EXECLIBTASK
  954.  
  955.     DC.L    0
  956.     DC.L    0
  957.     DC.L    0
  958.     DC.B    NT_MESSAGE
  959.     DC.B    0
  960.  
  961.     DC.L    1            ;DUE LORDS OF WAR -UNDOCUMENTED-
  962.  
  963.     ENDC
  964.  
  965.     cnop    0,4
  966. _DummyCList:                ; added by JOTD
  967.     dc.l    $FFFFFFFE
  968.  
  969. **************************************************************************
  970. *   VERSION                                                              *
  971. **************************************************************************
  972.  
  973.     IFND BARFLY
  974.         DC.B    '$VER: OS_EMUMODULE 0.26 +DEV (05-dec-1998 8:00:00)',0
  975.     ELSE
  976.         dc.b    "$VER: OSEmu "
  977.         DOSCMD    "WDate >T:date"
  978.         INCBIN    "T:date"
  979.         dc.b    0
  980.         dc.b    "$Id: osemu.asm 1.2 1999/02/03 04:10:48 jotd Exp jotd $"
  981.     ENDC
  982.     EVEN
  983.  
  984. **************************************************************************
  985. *   GLOBAL INITIALIZATION                                                *
  986. **************************************************************************
  987. ;REQUIRES NOW AT LEAST WHDLOAD 7.0
  988. ;ALTHOUGH THERE IS NO MULTITASKING IMPLEMENTED AT THE MOMENT,
  989. ;ALL FUNCTIONS MUST BE IMPLEMENTED REENTRANTLY
  990. ;
  991. ; IN:    A0 = resload base
  992. ;    A1 = pointer to slave structure
  993. ; OUT:    A1 = ioreq of trackdisk.device
  994. ;    A6 = execbase
  995.  
  996. _Init        movem.l    d0-a0/a2-a5,-(a7)
  997.  
  998.         cmp.w    #7,(ws_Version,a1)    ;minimum version
  999.         blo    _ill
  1000.  
  1001.         move.l    a0,_RESLOAD
  1002.         move.l    a1,(_Slave)
  1003.  
  1004.     ;install a default copperlist
  1005.  
  1006.         move.l    #_DummyCList,(_custom+cop1lc)
  1007.  
  1008.     ;correct structures
  1009. BCPLCORRECT    MACRO
  1010.         move.l    \1,d0
  1011.         lsr.l    #2,d0
  1012.         move.l    d0,\1
  1013.         ENDM
  1014.         BCPLCORRECT    _bcplcorrect1
  1015.         BCPLCORRECT    _bcplcorrect2
  1016.  
  1017.     ;init memory managment
  1018.  
  1019.     ; chip memory
  1020.  
  1021.         lea    _osemu_end,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1022.         move.l    (ws_BaseMemSize,a1),d0
  1023.         SUBQ.L    #8,D0
  1024.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1025.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1026. .1        CLR.B    (A0)+
  1027.         SUBQ.L    #1,D0
  1028.         BPL.S    .1
  1029.         MOVE.L    A0,ALLOCMTABSIZE
  1030.         move.l    (ws_BaseMemSize,a1),d0
  1031.         SUB.L    A0,D0
  1032.         SUB.L    #$1000,D0        ;$1000 SYSTEM STACK ON TOP
  1033.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1034.         BSR    FREEM
  1035.  
  1036.     ; fast memory if available
  1037.  
  1038. ;;    clr.l    OSM_EXPMEM
  1039.  
  1040.         move.l    OSM_EXPMEM,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1041.         cmp.l    #0,A0
  1042.         beq.b    .nofast
  1043.     
  1044.         move.l    OSM_EXPSIZE,d0
  1045.         SUBQ.L    #8,D0
  1046.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1047.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1048. .2        CLR.B    (A0)+
  1049.         SUBQ.L    #1,D0
  1050.         BPL.S    .2
  1051.         MOVE.L    A0,ALLOCFASTMTABSIZE    ; not real size!
  1052.  
  1053.         move.l    OSM_EXPSIZE,d0
  1054.         add.l    OSM_EXPMEM,D0        ; adds expbase
  1055.         SUB.L    A0,D0            ; substracts expbase+tabsize
  1056.         SUB.L    #$100,D0        ;$100 safety
  1057.  
  1058.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1059.         BSR    FREEM
  1060.  
  1061. .nofast:
  1062.     ;allocate stack
  1063.         move.l    #USPLENGTH,d0
  1064.         moveq    #MEMF_PUBLIC,d1    ; MEMF_CHIP removed
  1065.         bsr    ALLOCM
  1066.         move.l    d0,a0
  1067.         MOVE.L    A0,_EXECLIBTASK+TC_SPLOWER
  1068.         add.l    #USPLENGTH-4,a0
  1069.         move.l    a0,usp
  1070.         MOVE.L    A0,_EXECLIBTASK+pr_StackBase
  1071.         MOVE.L    #USPLENGTH-$20,(A0)+
  1072.         MOVE.L    A0,_EXECLIBTASK+TC_SPUPPER
  1073.  
  1074.     ;get whdload vars
  1075.         lea    _tags,a0
  1076.         move.l    _RESLOAD,a1
  1077.         jsr    (resload_Control,a1)
  1078.  
  1079.     ;init libraries
  1080.         bsr    CIAAINIT        ;required because int handling
  1081.         bsr    CIABINIT        ;required because int handling
  1082.         bsr    EXECINIT
  1083.         bsr    GFXINIT            ;required for display init (copper)
  1084.         IFNE    CORRECTDEVICES
  1085.         BSR.W    MAKEDEVICELIST
  1086.         ENDC
  1087.         move.w    #INTF_SETCLR!INTF_INTEN!INTF_EXTER!INTF_VERTB!INTF_PORTS,(_custom+intena)
  1088.  
  1089.  
  1090.     ;flush caches
  1091.         move.l    (_RESLOAD),a0
  1092.         jsr    (resload_FlushCache,a0)
  1093.  
  1094.     ;prepare return values
  1095.         move.l    (4),a6
  1096.         move.l    #$400+IOTD_SIZE,d0
  1097.         moveq    #0,d1
  1098.         jsr    (_LVOAllocMem,a6)
  1099.         move.l    d0,a2
  1100.         lea    (_tdname),a0
  1101.         moveq    #0,d0
  1102.         move.l    a2,a1
  1103.         moveq    #0,d1
  1104.         jsr    (_LVOOpenDevice,a6)
  1105.         move.l    a2,a1
  1106.         lea    (IOTD_SIZE,a2),a0
  1107.         move.l    a0,(IO_DATA,a1)
  1108.         move.l    #$400,(IO_LENGTH,a1)
  1109.         clr.l    (IO_OFFSET,a1)
  1110.         move.w    #CMD_READ,(IO_COMMAND,a1)
  1111.  
  1112.         movem.l    (a7)+,d0-a0/a2-a5
  1113.  
  1114.         rts
  1115.  
  1116. ; Added by JOTD: enter debugger (useful for debugging with JST)
  1117.  
  1118. EnterDebugger:
  1119.     move.l    A0,-(A7)
  1120.     move.l    OSM_DEBUGENTRY,A0
  1121.     cmp.l    #0,A0
  1122.     beq.b    .exit
  1123.     jsr    (A0)
  1124. .exit
  1125.     move.l    (A7)+,A0
  1126.     rts
  1127.  
  1128. **************************************************************************
  1129. *   MISC FUNCTIONS                                                       *
  1130. **************************************************************************
  1131. ;-----------------------------------------------
  1132. ; IN:    D0 = ULONG size of jmp table
  1133. ;    D1 = ULONG size of variable area
  1134. ;    A0 = CPTR  subsystem name
  1135. ; OUT:    D0 = APTR  librarybase
  1136.  
  1137. _InitStruct    movem.l    d0-d1/a0,-(a7)
  1138.         add.l    d1,d0
  1139.         moveq    #MEMF_CHIP,d1        ;changed by JOTD
  1140.         bsr    ALLOCM
  1141.         move.l    d0,a0            ;jmp table start
  1142.                 move.l    d0,a1
  1143.         add.l    (a7),a1            ;jmp table end
  1144.  
  1145.         lea    _LVOFail,a2
  1146. .1        move.w    #$4EB9,(A0)+
  1147.         move.l    a2,(a0)+
  1148.         cmp.l    a0,a1
  1149.         bhi    .1
  1150.         move.l    (8,a7),-4(a0)        ;name of library
  1151.         move.l    a0,(A7)            ;library base
  1152.         move.l    a0,a1            ;variables start
  1153.         add.l    (4,a7),a1        ;variables end
  1154. .2        move.w    #$eeee,(a0)+
  1155.         cmp.l    a0,a1
  1156.         bhi    .2
  1157.         MOVEM.L    (A7)+,D0/D1/A0
  1158.         rts
  1159.  
  1160. _InitLibrary    BSR.S    _InitStruct
  1161.         MOVE.L    D0,A1
  1162.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1163.         SF    LN_PRI(A1)
  1164.         move.l    A0,LN_NAME(A1)        ;name of library
  1165.         LEA.L    _LIBLIST(PC),A0
  1166.         BSR.W    _ADDTAIL
  1167.         rts
  1168.  
  1169.     IFNE    CORRECTDEVICES
  1170. _InitDevice    BSR.S    _InitStruct
  1171.         MOVE.L    D0,A1
  1172.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1173.         SF    LN_PRI(A1)
  1174.         move.l    A0,LN_NAME(A1)        ;name of library
  1175.         LEA.L    _DEVLISTC(PC),A0
  1176.         BSR.W    _ADDTAIL
  1177.         rts
  1178.     ENDC
  1179.  
  1180. _LVOFail    exg.l    d0,a6
  1181.         sub.l    d0,(a7)            ;LVO
  1182.         exg.l    d0,a6
  1183.         subq.l    #6,(a7)
  1184.         move.l    (-4,a6),-(a7)        ;name of library
  1185. _emufail    pea    TDREASON_OSEMUFAIL
  1186.         move.l    _RESLOAD(pc),-(a7)
  1187.         addq.l    #resload_Abort,(a7)
  1188. _rts        rts
  1189.  
  1190. EMUFAIL        MACRO
  1191.         pea    \1
  1192.         pea    \2
  1193.         bra    _emufail
  1194.         ENDM
  1195. EXECFAIL    MACRO
  1196.         EMUFAIL    \1,_execname
  1197.         ENDM
  1198. GFXFAIL        MACRO
  1199.         EMUFAIL    \1,_gfxname
  1200.         ENDM
  1201.  
  1202. ;-----------------------------------------------
  1203. ; IN:    A0 = CPTR  string 1
  1204. ;    A0 = CPTR  string 2
  1205. ; OUT:    D0 = LONG  0 if strings are equal
  1206.  
  1207. _strcmp        movem.l    a0-a1,-(a7)
  1208. .1        cmpm.b    (a0)+,(a1)+
  1209.         bne    .not
  1210.         tst.b    (-1,a0)
  1211.         bne    .1
  1212.         move    #0,d0
  1213.         movem.l    (a7)+,a0-a1
  1214.         rts
  1215.  
  1216. .not        moveq    #-1,d0
  1217.         movem.l    (a7)+,a0-a1
  1218.         rts
  1219.  
  1220. ;-----------------------------------------------
  1221. ; wait for vertical blank
  1222.  
  1223. _waitvb
  1224. .1        btst    #0,(_custom+vposr+1)
  1225.         beq    .1
  1226. .2        btst    #0,(_custom+vposr+1)
  1227.         bne    .2
  1228.         rts
  1229.  
  1230. _ill        illegal
  1231.  
  1232. **************************************************************************
  1233. *   EXEC LIBRARY                                                         *
  1234. **************************************************************************
  1235.  
  1236. EXEC2INIT
  1237.     move.l    A6,D0    ; NightShift tries to open exec.library!
  1238.     rts
  1239.  
  1240. **************************************************************************
  1241. *   INITIALIZATION                                                       *
  1242. **************************************************************************
  1243.  
  1244. EXECINIT
  1245.     ;    move.l    4,d0
  1246.     ;    btst    #0,d0
  1247.     ;    bne    .init
  1248.     ;    rts
  1249.  
  1250. .init        lea    _EXECMINSIZE(PC),A0
  1251.         LEA.L    _EXECLIBBASE(PC),A1
  1252.         lea    _LVOFail,a2
  1253. .1        move.w    #$4EB9,(A0)+
  1254.         move.l    a2,(a0)+
  1255.         cmp.l    a0,a1
  1256.         bhi    .1
  1257.         move.l    #_execname,-4(a0)    ;name of library
  1258.         MOVE.L    a1,a0
  1259.         move.l    a0,$4.W
  1260.         
  1261.         patch    _LVOOldOpenLibrary(a0),OPENLIB(pc)
  1262.         patch    _LVOOpenLibrary(a0),OPENLIB(pc)
  1263.         patch    _LVOCloseLibrary(A0),MYRTS(PC)
  1264.  
  1265.         patch    _LVOAllocMem(a0),ALLOCM(PC)
  1266.         patch    _LVOFreeMem(a0),FREEM(PC)
  1267.         patch    _LVOAvailMem(a0),AVAILM(PC)
  1268.         patch    _LVOAllocAbs(a0),ALLOCA(PC)
  1269.         patch    _LVOCopyMem(A0),_COPYMEM(PC)
  1270.         patch    _LVOAllocEntry(a0),ALLOCENTRY(PC)
  1271.         patch    _LVOFreeEntry(a0),FREEENTRY(PC)
  1272.  
  1273.         patch    _LVOForbid(a0),MYRTS(PC)
  1274.         patch    _LVOPermit(a0),MYRTS(PC)
  1275.         patch    _LVOSetIntVector(A0),_SETINTVECTOR(PC)
  1276.         patch    _LVOAddIntServer(a0),_AddIntServer(PC)
  1277.         patch    _LVORemIntServer(a0),_RemIntServer(PC)
  1278.         patch    -$24(A0),_ExitIntr(PC)
  1279.     ;    patch    _LVOEnqueue(a0),_Enqueue(PC)
  1280.         patch    _LVOOpenResource(a0),OPENRES(PC)
  1281.         patch    _LVOSupervisor(a0),_Supervisor(PC)
  1282.         patch    _LVOSuperState(a0),_SuperState(PC)
  1283.         patch    _LVOUserState(a0),_UserState(PC)
  1284.         patch    _LVOFindTask(a0),_FINDTASK(PC)
  1285.         patch    _LVORemTask(a0),MYRTS(PC)
  1286.         patch    _LVOSetTaskPri(A0),MYRTZ(PC)
  1287.  
  1288.         patch    _LVOAddPort(a0),MYRTS(PC)
  1289.         patch    _LVOOpenDevice(a0),_OpenDevice(PC)
  1290.         patch    _LVODoIO(a0),_DoIO(PC)
  1291.         patch    _LVOWaitIO(A0),_WAITIO(PC)    ; uncommented by JOTD
  1292.         patch    _LVOAbortIO(A0),_ABORTIO(PC)
  1293.         patch    _LVOCheckIO(A0),_CHECKIO(PC)    ; added by JOTD
  1294.         patch    _LVOSendIO(a0),_SendIO(PC)
  1295.         patch    _LVOCloseDevice(a0),MYRTS(PC)
  1296.         patch    _LVORemPort(a0),MYRTS(PC)
  1297.  
  1298.         patch    _LVOAllocSignal(a0),_AllocSignal(PC)
  1299.         patch    _LVOFreeSignal(a0),_FreeSignal(PC)
  1300.         patch    _LVOSetSignal(a0),_SetSignal(PC)
  1301.         patch    _LVODisable(a0),_Disable(PC)
  1302.         patch    _LVOEnable(a0),_Enable(PC)
  1303.         patch    _LVOWaitPort(A0),MYRTS(PC)
  1304.         patch    _LVOGetMsg(A0),MYRTZ(PC)
  1305.         patch    _LVOCreateIORequest(A0),_CreateIORequest(PC)
  1306.         patch    _LVODeleteIORequest(A0),_DeleteIORequest(PC)
  1307.         patch    _LVOCreateMsgPort(A0),_CreateMsgPort(PC)
  1308.         patch    _LVODeleteMsgPort(A0),_DeleteMsgPort(PC)
  1309.  
  1310.         patch    _LVOInsert(A0),_INSERT(PC)
  1311.         patch    _LVOAddHead(A0),_ADDHEAD(PC)
  1312.         patch    _LVOAddTail(A0),_ADDTAIL(PC)
  1313.         patch    _LVORemove(A0),_REMOVE(PC)
  1314.         patch    _LVORemHead(A0),_REMHEAD(PC)
  1315.         patch    _LVORemTail(A0),_REMTAIL(PC)
  1316.         patch    _LVOFindName(A0),_FINDNAME(PC)
  1317.  
  1318.         patch    _LVOCacheControl(A0),MYRTZ(PC)    ; added by JOTD
  1319.         patch    _LVOCacheClearU(A0),_CacheClearU(PC)    ; added by JOTD
  1320.         patch    _LVOSetFunction(A0),_SetFunction(PC)    ; added by JOTD
  1321.         patch    _LVOFindResident(A0),_FindResident(PC)    ; added by JOTD
  1322.  
  1323.         move.w    (_attnflags),(AttnFlags,a0)
  1324.  
  1325.         MOVE.L    _Slave(PC),A1
  1326.         MOVE.L    ws_BaseMemSize(A1),A1
  1327.         MOVE.L    A1,SysStkUpper(A0)
  1328.         MOVE.L    A1,MaxLocMem(A0)
  1329.         LEA.L    -$1000(A1),A1
  1330.         MOVE.L    A1,SysStkLower(A0)
  1331.         MOVE.L    _monitor(PC),D0
  1332.         MOVEQ.L    #60,D1
  1333.         AND.L    #$FFFF1000,D0
  1334.         CMP.L    #$21000,D0
  1335.         BNE.S    .nopal
  1336.         moveq.l    #50,D1
  1337. .nopal
  1338.         move.b    d1,VBlankFrequency(A0)
  1339.  
  1340.     ;clear int table
  1341.         lea    (IntVects,a0),a1
  1342.         moveq    #16*IV_SIZE/4-1,d0
  1343. .c1        MOVE.L    #$DDDDDDDD,(a1)+
  1344.         dbf    d0,.c1
  1345.     ;init int table
  1346.         LEA.L    (IVPORTS,A0),A1
  1347.         MOVE.L    A1,(IV_DATA,a1)
  1348.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1349.         move.l    #INTSERVNODE_CIAA,(IV_NODE,a1)
  1350.  
  1351.         LEA.L    (IVVERTB,A0),A1
  1352.         MOVE.L    A1,(IV_DATA,a1)
  1353.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1354.         CLR.L    (IV_NODE,a1)
  1355.  
  1356.         LEA.L    (IVEXTER,A0),A1
  1357.         MOVE.L    A1,(IV_DATA,a1)
  1358.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1359.         move.l    #INTSERVNODE_CIAB,(IV_NODE,a1)
  1360.  
  1361.         LEA.L    (IVAUD0,A0),A1
  1362.         MOVE.L    A1,(IV_DATA,a1)
  1363.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1364.         move.l    #INTSERVNODE_AUDIO0,(IV_NODE,a1)
  1365.  
  1366.         LEA.L    (IVAUD1,A0),A1
  1367.         MOVE.L    A1,(IV_DATA,a1)
  1368.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1369.         move.l    #INTSERVNODE_AUDIO1,(IV_NODE,a1)
  1370.  
  1371.         LEA.L    (IVAUD2,A0),A1
  1372.         MOVE.L    A1,(IV_DATA,a1)
  1373.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1374.         move.l    #INTSERVNODE_AUDIO2,(IV_NODE,a1)
  1375.  
  1376.         LEA.L    (IVAUD3,A0),A1
  1377.         MOVE.L    A1,(IV_DATA,a1)
  1378.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1379.         move.l    #INTSERVNODE_AUDIO3,(IV_NODE,a1)
  1380.  
  1381.     ;init hardware ints
  1382.         move.l    #INT_68,$68
  1383.         move.l    #INT_6c,$6c
  1384.         MOVE.L    #INT_70,$70
  1385.         move.l    #INT_78,$78
  1386.  
  1387.         move.b    #$1f,$bfed01
  1388.         MOVE.B    #$8F,$BFED01
  1389.         tst.B    $BFED01
  1390.         move.b    #$1f,$bfdd00
  1391. ;        MOVE.B    #$87,$BFDD00    ; OS not enable TOD int (Mr.Larmer)
  1392.         MOVE.B    #$83,$BFDD00
  1393.         tst.b    $bfdd00
  1394.         
  1395.         move.w    #$7fff,(_custom+intena)
  1396.  
  1397.         rts
  1398.  
  1399.     IFNE    CORRECTDEVICES
  1400. MAKEDEVICELIST
  1401.         MOVE.L    4.W,A0
  1402.         move.l    #$24,d0
  1403. ;        move.l    #LIB_SIZE,d1
  1404.         move.l    #LIB_SIZE+$a,d1
  1405.         lea    _tdname(PC),a0
  1406.         bsr    _InitDevice
  1407.         MOVE.L    d0,_tddevtable+4
  1408.         MOVE.L    D0,A0
  1409.         CLR.L    $28(A0)            ;DUE LORDS OF WAR
  1410.         MOVE.L    #_TDDMSGPORT,$24(A0)    ;-"-
  1411.         move.l    #$24,d0
  1412.         move.l    #LIB_SIZE,d1
  1413.         lea    _inpname(PC),a0
  1414.         bsr    _InitDevice
  1415.         MOVE.L    d0,_inpdevtable+4
  1416.         move.l    #$24,d0
  1417.         move.l    #LIB_SIZE,d1
  1418.         lea    _audname(PC),a0
  1419.         bsr    _InitDevice
  1420.         MOVE.L    d0,_auddevtable+4
  1421.  
  1422.         MOVE.L    D0,A0
  1423.         patch    -$1E(A0),_SENDAUDIO(PC)
  1424.  
  1425.         move.l    #$24,d0        ; cd.device, added by JOTD
  1426.         move.l    #LIB_SIZE,d1
  1427.         lea    _cdname(PC),a0
  1428.         bsr    _InitDevice
  1429.         MOVE.L    d0,_cddevtable+4
  1430.  
  1431.         move.l    #$24,d0        ; cdtv.device, added by JOTD
  1432.         move.l    #LIB_SIZE,d1
  1433.         lea    _cdtvname(PC),a0
  1434.         bsr    _InitDevice
  1435.         MOVE.L    d0,_cdtvdevtable+4
  1436.  
  1437.         move.l    #$24,d0        ; dummy console.device
  1438.         move.l    #LIB_SIZE,d1
  1439.         lea    _condevname(PC),a0
  1440.         bsr    _InitDevice
  1441.         MOVE.L    d0,_condevtable+4
  1442.  
  1443.         move.l    #$24,d0
  1444. ;        move.l    #LIB_SIZE,d1
  1445.         move.l    #$14C,d1
  1446.         lea    _kbdevname(PC),a0
  1447.         bsr    _InitDevice
  1448.         MOVE.L    d0,_kbdevtable+4
  1449.  
  1450.         move.l    d0,INTSERVNODE_SP+IS_DATA
  1451.  
  1452.         move.l    d0,a0
  1453.         lea    $70(a0),a0
  1454.         move.l    #$14C-$70-1,d0
  1455. .clear
  1456.         clr.b    (a0)+
  1457.         dbf    d0,.clear
  1458.  
  1459.         RTS
  1460.  
  1461.     ENDC
  1462.  
  1463. MYRTZ        MOVEQ.L    #0,D0
  1464. MYRTS        RTS
  1465.  
  1466. **************************************************************************
  1467. *   MISC EXEC FUCTIONS                                                   *
  1468. **************************************************************************
  1469.  
  1470. _CacheClearU
  1471.         movem.l    A0,-(A7)
  1472.         move.l    (_RESLOAD),a0
  1473.         jsr    (resload_FlushCache,a0)
  1474.         movem.l    (A7)+,A0
  1475.         rts
  1476.  
  1477. _FindResident:
  1478.     moveq.l    #0,D0
  1479.     rts
  1480.  
  1481. _SetFunction                ; added by JOTD (Banshee)
  1482.         movem.l    D1,-(A7)
  1483.         move.l    2(A1,A0.W),D1
  1484.         move.l    D0,2(A1,A0.W)    ; changed
  1485.         move.l    D1,D0        ; old function
  1486.         movem.l    (A7)+,D1
  1487.         rts
  1488.  
  1489. _Supervisor    move.l    $bc,.s1
  1490.         move.l    #.c1,$bc
  1491.         trap    #15
  1492.         rts
  1493. .c1        move.l    .s1,$bc
  1494.         jmp    (a5)
  1495. .s1        dc.l    0
  1496.  
  1497. _SuperState    MOVE.L    A5,A0
  1498.         LEA       .ac,A5
  1499.         JMP       _LVOSupervisor(A6)
  1500. .ac        MOVE.L    A0,A5
  1501.         MOVEQ     #$00,D0
  1502.         BSET      #$05,(A7)
  1503.         BNE.S     .ca
  1504.         MOVE.W    (A7)+,SR
  1505.         MOVE.L    A7,D0
  1506.         MOVE.L    USP,A7
  1507.         BTST      #$00,$0129(A6)
  1508.         BEQ.S     .c6
  1509.         ADDQ.L    #$2,D0
  1510. .c6        ADDQ.L    #$4,D0
  1511.         RTS
  1512. .ca        RTE
  1513.  
  1514. _UserState    MOVE.L    (A7)+,A0
  1515.         MOVE.L    A7,USP
  1516.         MOVE.L    D0,A7
  1517.         ANDI.W    #$dfff,SR
  1518.         JMP       (A0)
  1519.  
  1520.  
  1521. _CreateIORequest
  1522.     movem.l    D2/D3,-(SP)
  1523.     move.l    D0,D2
  1524.     move.l    A0,D3
  1525.     beq.s    .error
  1526.     move.l    #$10001,D1
  1527.     jsr    _LVOAllocMem(A6)
  1528.     movea.l    D0,A0
  1529.     tst.l    D0
  1530.     beq.s    .error
  1531.     move.b    #NT_REPLYMSG,LN_TYPE(A0)
  1532.     move.l    D3,MN_REPLYPORT(A0)
  1533.     move.w    D2,MN_LENGTH(A0)
  1534. .error
  1535.     move.l    A0,D0
  1536.     movem.l    (SP)+,D2/D3
  1537.     rts
  1538.  
  1539. _DeleteIORequest
  1540.     move.l    A0,D0
  1541.     beq.s    .abort
  1542.     moveq    #-1,D0
  1543.     move.l    D0,LN_SUCC(A0)
  1544.     move.l    D0,IO_DEVICE(A0)
  1545.     moveq    #0,D0
  1546.     move.w    MN_LENGTH(A0),D0
  1547.     movea.l    A0,A1
  1548.     jsr    _LVOFreeMem(A6)
  1549. .abort
  1550.     rts
  1551.  
  1552. _CreateMsgPort
  1553.     moveq    #MP_SIZE,D0    ;$22,D0
  1554.     move.l    #$10001,D1
  1555.     jsr    _LVOAllocMem(A6)
  1556.     move.l    D0,-(SP)
  1557.     beq.s    .error
  1558.     moveq    #-1,D0
  1559.     jsr    _LVOAllocSignal(A6)
  1560.     movea.l    (SP),A0
  1561.     move.b    #NT_MSGPORT,LN_TYPE(A0)
  1562.     move.b    #PA_SIGNAL,MP_FLAGS(A0)
  1563.     move.b    D0,MP_SIGBIT(A0)
  1564.     bmi.s    .abort
  1565.     move.l    ThisTask(A6),MP_SIGTASK(A0)
  1566.     lea    MP_MSGLIST(A0),A1
  1567.     move.l    A1,8(A1)
  1568.     addq.l    #4,A1
  1569.     clr.l    (A1)
  1570.     move.l    A1,-(A1)
  1571. .error
  1572.     move.l    (SP)+,D0
  1573.     rts
  1574.  
  1575. .abort
  1576.     moveq    #MP_SIZE,D0
  1577.     movea.l    A0,A1
  1578.     jsr    _LVOFreeMem(A6)
  1579.     clr.l    (SP)
  1580.     bra.s    .error
  1581.  
  1582. _DeleteMsgPort
  1583.     move.l    A0,-(SP)
  1584.     beq.s    .abort
  1585.     moveq    #0,D0
  1586.     move.b    MP_SIGBIT(A0),D0
  1587.     jsr    _LVOFreeSignal(A6)
  1588.     movea.l    (SP),A1
  1589.     moveq    #-1,D0
  1590.     move.l    D0,MP_MSGLIST(A1)
  1591.     move.l    D0,LN_SUCC(A1)
  1592.     moveq    #MP_SIZE,D0
  1593.     jsr    _LVOFreeMem(A6)
  1594. .abort
  1595.     addq.l    #4,SP
  1596.     rts
  1597.  
  1598.  
  1599. **************************************************************************
  1600. *   Task related functions                                               *
  1601. **************************************************************************
  1602.  
  1603. _AllocSignal
  1604.     movea.l    ThisTask(A6),A1
  1605.     move.l    TC_SIGALLOC(A1),D1
  1606.     cmp.b    #-1,D0
  1607.     beq.s    .search
  1608.     bset    D0,D1
  1609.     beq.s    .free
  1610.     bra.s    .err
  1611.  
  1612. .search
  1613.     moveq.l    #$20-1,D0
  1614. .search2
  1615.     bset    D0,D1
  1616.     beq.s    .free
  1617.     dbra    D0,.search2
  1618. .err
  1619.     moveq.l    #-1,D0
  1620.     rts
  1621.  
  1622. .free
  1623.     move.l    D1,TC_SIGALLOC(A1)
  1624.     moveq    #-1,D1
  1625.     bclr    D0,D1
  1626.     and.l    D1,TC_SIGRECVD(A1)
  1627.     and.l    D1,TC_SIGEXCEPT(A1)
  1628.     and.l    D1,TC_SIGWAIT(A1)
  1629.     rts
  1630.  
  1631. _FreeSignal
  1632.         cmp.b    #$FF,D0
  1633.         beq.s    .skip            ; Mr Larmer: no more error
  1634.         movea.l    ThisTask(A6),A1
  1635.         move.l    TC_SIGALLOC(A1),D1
  1636.         bclr    D0,D1
  1637.         move.l    D1,TC_SIGALLOC(A1)
  1638. .skip
  1639.         rts
  1640.  
  1641.  
  1642. _SetSignal    MOVE.L    ThisTask(A6),A0
  1643.         MOVE.L    TC_SIGRECVD(A0),-(A7)
  1644.         AND.L    D1,D0
  1645.         NOT.L    D1
  1646.         AND.L    TC_SIGRECVD(A0),D1
  1647.         OR.L    D0,D1
  1648.         MOVE.L    D1,TC_SIGRECVD(A0)
  1649.         MOVE.L    (A7)+,d0
  1650.         rts
  1651.  
  1652. _Disable
  1653.         move.w    #INTF_INTEN,(_custom+intena)
  1654.         rts
  1655. _Enable
  1656.         move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  1657.         rts
  1658.  
  1659. _FINDTASK    MOVE.L    A1,-(A7)    ;fails if not own task searched
  1660.         TST.L    (A7)+
  1661.         BNE.S    .FAIL
  1662.         MOVE.L    4.W,A0
  1663.         MOVE.L    ThisTask(A0),D0
  1664.         RTS
  1665.  
  1666. .FAIL
  1667. ;        MOVEQ.L    #0,d0
  1668. ;        rts
  1669.         pea    _LVOFindTask
  1670.         pea    _execname
  1671.         bra    _emufail
  1672.  
  1673. **************************************************************************
  1674. *   MEMORYFUNCTIONS                                                      *
  1675. **************************************************************************
  1676.  
  1677. ; AllocEntry(): Added by JOTD by request of Bored Seal
  1678. ; Tested on DragonNinja
  1679.  
  1680. ; < A0: memList
  1681. ; > D0: allocated memList
  1682.  
  1683. ALLOCENTRY:
  1684.     movem.l    D1-A6,-(A7)
  1685.     move.l    A0,A5
  1686.     moveq.l    #0,D0
  1687.     move.w    LN_SIZE(A5),D0
  1688.     lsl.l    #3,D0
  1689.     add.l    #$10,D0
  1690.     move.l    D0,D5        ; size
  1691.     move.l    #MEMF_PUBLIC,D1
  1692.     jsr    (_LVOAllocMem,a6)
  1693.     move.l    D0,D6
  1694.     beq.b    .fail
  1695.  
  1696.     ; allocated OK
  1697.  
  1698.     move.l    D6,A4
  1699.  
  1700.     moveq.l    #0,D0
  1701.     move.l    A5,A0
  1702.     move.l    A4,A1
  1703.     move.l    D5,D0
  1704.     jsr    (_LVOCopyMem,a6)
  1705.  
  1706.     moveq.l    #0,D2
  1707.     move.w    LN_SIZE(A4),D2    ; # of items
  1708.     
  1709.     add.l    #LN_SIZE+2,A4
  1710. .loop
  1711.     move.l    (A4)+,D1    ; flags
  1712.     move.l    (A4)+,D0    ; size
  1713.     jsr    (_LVOAllocMem,a6)
  1714.     beq.b    .fail        ; alloc problem
  1715.     move.l    D0,-8(A4)    ; store memblock start in flags (union)
  1716.     subq.l    #1,D2
  1717.     bne.b    .loop
  1718.  
  1719.     move.l    D6,D0        ; new memlist
  1720. .exit
  1721.     movem.l    (A7)+,D1-A6
  1722.     rts
  1723.  
  1724. .fail:
  1725.     moveq.l    #0,D0
  1726.     bset    #31,D0
  1727.     bra.b    .exit
  1728.  
  1729. ; FreeEntry(): still untested but should work
  1730.  
  1731. FREEENTRY:
  1732.  
  1733.     movem.l    D1-A6,-(A7)
  1734.     move.l    A0,A4
  1735.  
  1736.     move.w    LN_SIZE(A4),D2    ; # of items
  1737.     
  1738.     add.l    #LN_SIZE+2,A4
  1739. .loop
  1740.     move.l    (A4)+,A1    ; memory pointer
  1741.     move.l    (A4)+,D0    ; memory size
  1742.     jsr    (_LVOFreeMem,a6)
  1743.     subq.l    #1,D2
  1744.     bne.b    .loop
  1745.  
  1746. .exit
  1747.     movem.l    (A7)+,D1-A6
  1748.     rts
  1749.  
  1750. _COPYMEM
  1751.     CMP.L    A0,A1
  1752.     BLS.S    .ASCEND
  1753. .DESCEND
  1754.     LEA.L    (A0,D0.L),A0
  1755.     LEA.L    (A1,D0.L),A1
  1756. .LD    MOVE.B    -(A0),-(A1)
  1757.     SUBQ.L    #1,D0
  1758.     BNE.S    .LD
  1759.     RTS
  1760.  
  1761. .ASCEND
  1762. .LA    MOVE.B    (A0)+,(A1)+
  1763.     SUBQ.L    #1,D0
  1764.     BNE.S    .LA
  1765.     RTS
  1766.  
  1767. FREEM
  1768.     TST.L    D0
  1769.     BNE.S    .NOZERO
  1770.     RTS
  1771.  
  1772. .NOZERO
  1773.     cmp.l    #$1000000,D0    ; JOTD: safety, I had to switch off my amy
  1774.     bcc.b    .FREEMFAIL    ; when the value passed was too high (here >16MB)!    
  1775.  
  1776.     CMP.L    #ALLOCMTAB,A1        ; above ALLOCMTAB
  1777.     BHS.S    .OK            ; okay, try to free
  1778. .FREEMFAIL
  1779.     pea    _LVOFreeMem
  1780.     pea    _execname
  1781.     bra    _emufail
  1782.  
  1783. .OK
  1784.     tst.l    OSM_EXPMEM
  1785.     beq.b    .FreeChip
  1786.  
  1787.     cmp.l    OSM_EXPMEM,A1
  1788.     bcs.b    .FreeChip    ; below expansion memory -> chipmem
  1789.  
  1790.     ; fast memory - added by JOTD
  1791.  
  1792. .FreeFast:
  1793.     move.l    OSM_EXPMEM,A0        ; start of memory expansion
  1794.     add.l    OSM_EXPSIZE,A0        ; size of memory expansion
  1795.  
  1796.     cmp.l    A0,A1
  1797.     bcc.b    .FREEMFAIL        ; trying to free above memory expansion
  1798.  
  1799.     move.l    OSM_EXPMEM,A0        ; start of memory table (fastmem)
  1800.     sub.l    A0,A1            ; corrects offset on address !!
  1801.     bra.b    .FreeGeneric
  1802.  
  1803.     ; chip memory - Harry's original
  1804.  
  1805. .FreeChip:
  1806.     LEA.L    ALLOCMTAB,A0        ; start of memory table (chipmem)
  1807.     bra.b    .FreeGeneric
  1808.  
  1809. .FreeGeneric:
  1810.     MOVEM.L    D2/D3/A2/A3,-(A7)
  1811.     MOVE.L    A1,D1
  1812.     ADDQ.L    #7,D0
  1813.     AND.L    #$FFFFFFF8,D1
  1814.     AND.L    #$FFFFFFF8,D0
  1815.     BEQ.S    .QU
  1816.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  1817.  
  1818.                     ;FREE MEM NOT ON A $40-BOUNDARY
  1819.                     ;EVAL BEGINBYTE
  1820.     MOVE.L    D1,D2
  1821.     LSR.L    #6,D2
  1822.     LEA.L    (A0,D2.L),A0
  1823.     MOVEM.L    D1,-(A7)
  1824.     AND.L    #$3F,D1
  1825.     BEQ.S    .CNTCLR
  1826.     LSR.L    #3,D1
  1827. .2    BSET    D1,(A0)
  1828.     ADDQ.L    #1,D1
  1829.     ADDQ.L    #8,(A7)
  1830.     SUBQ.L    #1,D0
  1831.     BEQ.S    .1
  1832.     CMP.L    #8,D1
  1833.     BEQ.S    .CNTCLR2
  1834.     BRA.S    .2
  1835.  
  1836. .1    MOVEM.L    (A7)+,D1
  1837.     BRA.S    .QU
  1838.  
  1839. .CNTCLR2
  1840.     ADDQ.L    #1,A0
  1841. .CNTCLR
  1842.     MOVEM.L    (A7)+,D1
  1843.  
  1844.                     ;CLEAR $40-BOUNDARY-BYTES
  1845. .3    CMP.L    #8,D0
  1846.     BLO.S    .CLREND
  1847.  
  1848.     ST    (A0)+
  1849.     SUBQ.L    #8,D0
  1850.     BRA.S    .3
  1851.  
  1852.  
  1853. .CLREND                    ;CLEAR END NOT ENDING ON A $40-
  1854.     TST.L    D0            ;BOUNDARY
  1855.     BEQ.S    .QU
  1856.     SUBQ.L    #1,D0
  1857.     BSET    D0,(A0)
  1858.     BRA.S    .CLREND
  1859.  
  1860. .QU    MOVEM.L    (A7)+,D2/D3/A2/A3
  1861.     RTS
  1862.  
  1863.  
  1864.  
  1865. ;>D0:SIZE
  1866. ;>D1:CONDITIONS
  1867. ;<D0:ADDY
  1868. ;LIMITATIONS:
  1869. ;        -MEM ALWAYS CLEARED (MEMF_CLEAR ASSUMED)
  1870. ;        -MEMORY IS $40-ALIGNED (SOME BYTES WASTED)
  1871. ;        -MEMF_LARGEST IS IGNORED AS IN THE OS
  1872. ;        -ATM, ALSO MEMF_REVERSE IS IGNORED
  1873.  
  1874. ALLOCM:
  1875.     tst.l    d0
  1876.     beq    .NOFAST    ; not fatal anymore, allows broken programs to work
  1877.  
  1878.     MOVE.L    D1,-(A7)
  1879.     and.l    #~(MEMF_REVERSE!MEMF_LARGEST!MEMF_FAST!MEMF_CHIP!MEMF_CLEAR!MEMF_PUBLIC),(A7)+
  1880.     bne    .fail        ; wrong flags
  1881.     btst    #MEMB_CHIP,d1    ; chipmem required?
  1882.     BEQ.S    .FMEM        ; JOTD: MEMB_CHIP not specified -> alloc fast
  1883.     
  1884. .NORMALCHIP
  1885.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1886.  
  1887.     addq.l    #7,d0
  1888.     LSR.L    #3,D0
  1889.     ;SEARCH SUFFICIENT BIG MEMAREA
  1890.  
  1891.     LEA.L    ALLOCMTAB,A0    ;FIND A BYTE != 0 (FREE MEM)
  1892.     move.l    ALLOCMTABSIZE,A3
  1893.     sub.l    A4,A4
  1894.  
  1895.     bsr    AllocGeneric
  1896.  
  1897.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1898.     RTS
  1899.  
  1900. .FMEM:
  1901.     tst.l    OSM_EXPMEM
  1902.     bne.b    .ALLOCFAST        ; expansion available: allocate
  1903.  
  1904.     ; no expansion: check if fast is required
  1905.  
  1906.     btst    #MEMB_FAST,d1
  1907.     bne.b    .NOFAST            ; fastmem not available: error
  1908.  
  1909.     bra.b    .NORMALCHIP        ; no fast memory configured: try chipmem
  1910.  
  1911. .ALLOCFAST
  1912.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1913.     addq.l    #7,d0
  1914.     LSR.L    #3,D0
  1915.     ;SEARCH SUFFICIENT BIG MEMAREA
  1916.  
  1917.     move.l    OSM_EXPMEM,A0    ;FIND A BYTE != 0 (FREE MEM)
  1918.     move.l    ALLOCFASTMTABSIZE,A3
  1919.     move.l    A0,A4        ; offset to add for ALLOCA
  1920.  
  1921.     bsr    AllocGeneric
  1922.  
  1923.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1924.     RTS
  1925.  
  1926. .NOFAST
  1927.     moveq.l    #0,D0
  1928.     rts
  1929.  
  1930. .fail    
  1931.     EXECFAIL _LVOAllocMem
  1932.  
  1933. ; Added by JOTD to be used with chip and fast alloc
  1934. ; < A0: alloc table
  1935. ; < A3: end of alloc table
  1936. ; < A4: offset to add to calculated address (0 for chip, OSM_EXPMEM for fast)
  1937.  
  1938. AllocGeneric:
  1939.     MOVEQ.L    #0,D4
  1940. .2
  1941.     CMP.B    #$FF,(A0)+
  1942.     BEQ.S    .1
  1943.     ADD.L    #$40,D4
  1944.     CMP.L    A3,A0
  1945.     BNE.S    .2
  1946.     BRA.S    .ERR
  1947.                     ;found free mem
  1948.                     ;CHECK NOW SIZE 
  1949. .1    SUBQ.L    #1,A0
  1950.                     ;D4-BASE
  1951. .3
  1952.     MOVE.L    D0,-(A7)        ;WANTED SIZE
  1953.     MOVE.L    D4,-(A7)        ;FOUND ADDRESS
  1954.  
  1955. .6    TST.L    D0
  1956.     BMI.S    .CHKEND
  1957.     CMP.B    #$FF,(A0)
  1958.     BNE.S    .TOOSMALL
  1959.     ADDQ.L    #1,A0        ;CHECK FOR EXCEEDING THE SIZE OF ALLOCMTAB
  1960.                 ;MAY BE OMITTED SINCE ITS END CONTAINS $0
  1961.     ADD.L    #$40,D4
  1962.     SUBQ.L    #8,D0
  1963.     BEQ.S    .CHKEND
  1964.     BRA.S    .6
  1965.  
  1966. .TOOSMALL                ;LATER TODO: FIND EVENTUAL ZEROBITS
  1967.  
  1968.     ADDQ.L    #4,A7            ;DISCARD D4 ON STACK
  1969.     MOVE.L    (A7)+,D0
  1970.     ADDQ.L    #1,A0
  1971. ;    AND.L    #$FFFFFFC0,D4
  1972.     ADD.L    #$40,D4
  1973.     BRA.S    .2
  1974.  
  1975. .CHKEND
  1976.     MOVE.L    (A7)+,D4
  1977.     MOVE.L    (A7)+,D0
  1978.     LSL.L    #3,D0
  1979. ;D0-SIZE
  1980. ;D4-ABS
  1981.     ;MARK AREA AS USED
  1982.     MOVE.L    D4,A1
  1983.     MOVE.L    D0,D2
  1984.  
  1985.     add.l    A4,A1            ; added by JOTD, offset for fastmem
  1986.     BSR.W    ALLOCA
  1987.                     ;MEMORYSPACE ALREADY SUCESSFULLY
  1988.                     ;CHECKED, RETURNCODE MAY BE IGNORED
  1989.  
  1990.     MOVE.L    A1,A2
  1991. ;    MOVE.L    D4,D2
  1992.     LSR.L    #2,D2
  1993.     BRA.S    .CLRM
  1994.  
  1995. .CLRM1    CLR.L    (A2)+
  1996. .CLRM    DBF    D2,.CLRM1
  1997. .exit
  1998.     tst.l    d0            ;some progs expect an correct set zero flag
  1999.     rts
  2000. .ERR:
  2001.     moveq.l    #0,D0            ; unable to allocate: table full
  2002.     rts
  2003.  
  2004. ;RETURNS AT THE MOMENT ONLY THE SIZE OF THE LARGEST CHUNK-$1000 SAFETY
  2005. AVAILM
  2006.     MOVEM.L    A2/A3/D2/D3,-(A7)
  2007.     MOVE.L    D1,D2
  2008.     AND.L    #MEMF_FAST,D2
  2009.     BNE.S    .FMEM
  2010.  
  2011.     ; check for chipmem available
  2012.  
  2013.     LEA.L    ALLOCMTAB,A0
  2014.     move.l    ALLOCMTABSIZE(pc),A3
  2015.  
  2016.     bsr    GenericAvail
  2017.  
  2018.  
  2019. .exit
  2020.     MOVEM.L    (A7)+,A2/A3/D2/D3
  2021.     RTS
  2022.  
  2023. .FMEM    
  2024.     move.l    OSM_EXPMEM,A0
  2025.     cmp.l    #0,A0
  2026.     beq.b    .nomem
  2027.     move.l    ALLOCFASTMTABSIZE(pc),A3
  2028.  
  2029.     bsr    GenericAvail
  2030.     bra.b    .exit
  2031.  
  2032. .nomem:
  2033.     moveq.l    #0,D0
  2034.     bra.b    .exit
  2035.     
  2036. ; for chip & fast memory
  2037.  
  2038. GenericAvail:
  2039.     MOVEQ.L    #0,D2
  2040.     MOVEQ.L    #0,D3
  2041. .3    MOVE.B    (A0)+,D0
  2042.     CMP.B    #$FF,D0            ;SEARCH CHUNK
  2043.     BNE.S    .1
  2044.     ADD.L    #$40,D3
  2045.     BRA.S    .2
  2046.  
  2047. .1    CMP.L    D2,D3            ;END OF CHUNK, COMPARE SIZE WITH
  2048.     BLO.S    .4            ;PREVIOUS SIZE
  2049.     MOVE.L    D3,D2            ;ACTUAL IS LARGER -> NEW LARGEST SIZE
  2050. .4    MOVEQ.L    #0,D3            ;RESET SIZE OF NEXT CHUNK
  2051. .2    CMP.L    A3,A0            ;UNTIL MEMORYTABLE EXCEEDED
  2052.     BLO.S    .3
  2053.     cmp.l    d2,d3
  2054.     blo    .5
  2055.     move.l    d3,d2
  2056. .5
  2057.     CMP.L    #$2000,D2
  2058.     BLO.S    .6
  2059.     SUB.L    #$1000,D2
  2060. .6    MOVE.L    D2,D0
  2061.     rts
  2062.  
  2063. ALLOCA:
  2064.     tst.l    OSM_EXPMEM
  2065.     beq.b    .ALLOCA_CHIP    ; no expansion: alloc chipmem
  2066.     cmp.l    OSM_EXPMEM,A1
  2067.     bcc.b    .ALLOCA_FAST    ; above expansion: fast memory
  2068. .ALLOCA_CHIP:
  2069.     movem.l    A4,-(A7)
  2070.     LEA.L    ALLOCMTAB,A4    ; chipmem alloc table
  2071.     bsr    GenericAllocAbs
  2072.     movem.l    (A7)+,A4
  2073.     move.l    D0,A1
  2074.     rts
  2075.  
  2076. .ALLOCA_FAST:
  2077.     movem.l    A4,-(A7)
  2078.     move.l    OSM_EXPMEM,A4        ; fastmem alloc table
  2079.     sub.l    A4,A1            ; substracts expbase from the address
  2080.     bsr    GenericAllocAbs        ; the routine returns only offset
  2081.     add.l    A4,D0            ; relative to memory block so we have to add expbase
  2082.     move.l    D0,A1            ; A1=D0 for Harry!
  2083.     movem.l    (A7)+,A4
  2084.     rts
  2085.  
  2086. ; < A4: allocmtab (added by JOTD to be used by fastmem and chipmem)
  2087.  
  2088.  
  2089. GenericAllocAbs
  2090.     MOVEM.L    D2/D3/A2/A3,-(A7)
  2091.     MOVE.L    A7,A3
  2092.     MOVE.L    _Slave(PC),A2
  2093.     MOVE.L    A1,D2
  2094.     ADD.L    D0,D2
  2095.     CMP.L    A2,D2
  2096.     BHS.W    .ERR
  2097.  
  2098.     move.l    A1,D1
  2099.  
  2100. ;    ADDQ.L    #7,D1
  2101.     AND.L    #$FFFFFFF8,D1
  2102.     AND.L    #$FFFFFFF8,D0
  2103.     BEQ.W    .QU
  2104.     MOVEM.L    D0/D1,-(A7)
  2105.  
  2106.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2107.  
  2108.                     ;CHECK MEM NOT ON A $40-BOUNDARY
  2109.                     ;EVAL BEGINBYTE
  2110.     MOVE.L    D1,D2
  2111.     LSR.L    #6,D2
  2112.     move.L    A4,A0
  2113.     LEA.L    (A0,D2.L),A0
  2114.     MOVEM.L    D1,-(A7)
  2115.     AND.L    #$3F,D1
  2116.     BEQ.S    .CNTCHK
  2117.     LSR.L    #3,D1
  2118. .2    BTST    D1,(A0)
  2119.     BEQ.W    .ERR
  2120.     ADDQ.L    #1,D1
  2121. ;    ADDQ.L    #8,(A7)
  2122.     SUBQ.L    #1,D0
  2123.     BEQ.S    .1
  2124.     CMP.L    #8,D1
  2125.     BEQ.S    .CNTCHK2
  2126.     BRA.S    .2
  2127.  
  2128. .1    MOVEM.L    (A7)+,D1
  2129.     BRA.S    .CONT
  2130.  
  2131. .CNTCHK2
  2132.     ADDQ.L    #1,A0
  2133. .CNTCHK
  2134.     MOVEM.L    (A7)+,D1
  2135.  
  2136.                     ;CLEAR $40-BOUNDARY-BYTES
  2137. .3    CMP.L    #8,D0
  2138.     BLO.S    .CLREND
  2139.  
  2140.     CMP.B    #$FF,(A0)+
  2141.     BNE.S    .ERR
  2142.     SUBQ.L    #8,D0
  2143.     BRA.S    .3
  2144.  
  2145.  
  2146. .CLREND
  2147.     TST.L    D0
  2148.     BEQ.S    .CONT
  2149.     SUBQ.L    #1,D0
  2150.     BTST    D0,(A0)
  2151.     BEQ.S    .ERR
  2152.     BRA.S    .CLREND
  2153.  
  2154. .CONT    MOVEM.L    (A7)+,D0/D1
  2155.  
  2156.                     ;ALLOC MEM
  2157.  
  2158.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2159.  
  2160.                     ;MARK MEM NOT ON A $40-BOUNDARY
  2161.                     ;EVAL BEGINBYTE
  2162.     MOVE.L    D1,D2
  2163.     LSR.L    #6,D2
  2164.     move.l    A4,A0
  2165.     LEA.L    (A0,D2.L),A0
  2166.     MOVEM.L    D1,-(A7)
  2167.     AND.L    #$3F,D1
  2168.     BEQ.S    .CNTMARK
  2169.     LSR.L    #3,D1
  2170. .22    BCLR    D1,(A0)
  2171.     ADDQ.L    #1,D1
  2172. ;    ADDQ.L    #8,(A7)
  2173.     SUBQ.L    #1,D0
  2174.     BEQ.S    .21
  2175.     CMP.L    #8,D1
  2176.     BEQ.S    .CNTMARK2
  2177.     BRA.S    .22
  2178.  
  2179. .21    MOVEM.L    (A7)+,D1
  2180.     BRA.S    .QU
  2181.  
  2182. .CNTMARK2
  2183.     ADDQ.L    #1,A0
  2184. .CNTMARK
  2185.     MOVEM.L    (A7)+,D1
  2186.  
  2187.                     ;CLEAR $40-BOUNDARY-BYTES
  2188. .23    CMP.L    #8,D0
  2189.     BLO.S    .MARKEND
  2190.  
  2191.     SF    (A0)+
  2192.     SUBQ.L    #8,D0
  2193.     BRA.S    .23
  2194.  
  2195.  
  2196. .MARKEND
  2197.     TST.L    D0
  2198.     BEQ.S    .QU
  2199.     SUBQ.L    #1,D0
  2200.     BCLR    D0,(A0)
  2201.     BRA.S    .MARKEND
  2202.  
  2203. .QU
  2204.  
  2205.     MOVE.L    A3,A7
  2206.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2207.     MOVE.L    D1,D0
  2208.     RTS
  2209. .ERR2
  2210. .ERR    MOVE.L    A3,A7
  2211.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2212.     MOVEQ.L    #0,D0
  2213.     RTS
  2214.  
  2215.  
  2216. ****************************************************************************
  2217. * LIST HANDLING IN EXEC                                                    *
  2218. ****************************************************************************
  2219.  
  2220.     ifeq 1
  2221.  
  2222. _Enqueue    ;a0=list a1=node
  2223.     MOVE.B    (LN_PRI,A1),D1
  2224.     MOVE.L    (LN_SUCC,A0),D0
  2225. .1908    MOVE.L    D0,A0
  2226.     MOVE.L    (LN_SUCC,A0),D0
  2227.     BEQ.S     .1914
  2228.     CMP.B     (LN_PRI,A0),D1
  2229.     BLE.S     .1908
  2230. .1914    MOVE.L    (LN_PRED,A0),D0
  2231.     MOVE.L    A1,(LN_PRED,A0)
  2232.     MOVE.L    A0,(LN_SUCC,A1)
  2233.     MOVE.L    D0,(LN_PRED,A1)
  2234.     MOVE.L    D0,A0
  2235.     MOVE.L    A1,(LN_SUCC,A0)
  2236.     RTS
  2237.  
  2238.     endc
  2239.  
  2240. _FINDNAME    ;a0-list, a1-name, returns d0-node
  2241.     MOVEM.L    A2,-(A7)
  2242.     MOVE.L    A0,A2        ;find listheader (lords of war *grr*)
  2243. .HSEARCH
  2244.     TST.L    4(A2)
  2245.     BEQ.S    .HFOUND
  2246.     MOVE.L    4(A2),A2
  2247.     BRA.S    .HSEARCH
  2248.  
  2249. .HFOUND
  2250. .LOOP    TST.L    (A2)
  2251.     BEQ.S    .NOTFOUND
  2252.     MOVE.L    (A2),A2
  2253.     MOVE.L    LN_NAME(A2),A0
  2254.     BSR.W    _strcmp
  2255.     TST.L    D0
  2256.     BEQ.S    .FOUND
  2257.     BRA.S    .LOOP
  2258.  
  2259. .FOUND    MOVE.L    A2,D0
  2260.     MOVEM.L    (A7)+,A2
  2261.     RTS
  2262.  
  2263. .NOTFOUND
  2264.     MOVEQ.L    #0,D0
  2265.     MOVEM.L    (A7)+,A2
  2266.     RTS
  2267.  
  2268.  
  2269. _INSERT        ;a0-list a1-node to be inserted a2-node after which to insert
  2270. .HSEARCH
  2271.     TST.L    4(A0)
  2272.     BEQ.S    .HFOUND
  2273.     MOVE.L    4(A0),A0
  2274.     BRA.S    .HSEARCH
  2275.  
  2276. .HFOUND
  2277.     MOVE.L    A2,-(A7)
  2278.     TST.L    (A7)+
  2279.     BEQ.S    .ADDHEAD
  2280.     CMP.L    A0,A2
  2281.     BEQ.S    .ADDHEAD
  2282.     MOVE.L    LH_TAILPRED(A0),-(A7)
  2283.     CMPM.L    (A7)+,(A2)+    ;IF INSERTING AT END -> .ADDTAIL
  2284.     LEA.L    -4(A2),A2
  2285.     BEQ.S    .ADDTAIL
  2286.     MOVE.L    (A2),A0        ;SUCCESSOR
  2287.     MOVE.L    A1,(LN_PRED,A0)    ;NEW PREDECESSOR
  2288.     MOVE.L    (A2),(A1)    ;SUCCESSOR IN ELEMENT TO BE INSERTED
  2289.     MOVE.L    A2,(LN_PRED,A1)    ;PREDECESSOR IN ELEMENT TO BE INSERTED
  2290.     MOVE.L    A1,(A2)        ;INSERTED NODE IS SUCCESSOR
  2291.     RTS
  2292.  
  2293. .ADDTAIL
  2294.     MOVE.L    (A2),(A1)
  2295.     MOVE.L    A2,LN_PRED(A1)
  2296.     MOVE.L    A1,LH_TAILPRED(A0)
  2297.     MOVE.L    A1,(A2)
  2298.     RTS
  2299.  
  2300. .ADDHEAD
  2301. _ADDHEAD
  2302.     MOVE.L    A2,-(A7)
  2303.     MOVE.L    (A0),A2
  2304.     TST.L    (A2)
  2305.     BEQ.S    .EMPTYLIST
  2306.  
  2307.     MOVE.L    (A0),A2
  2308.     MOVE.L    A2,(A1)
  2309.     MOVE.L    LN_PRED(A2),LN_PRED(A1)
  2310.     MOVE.L    A1,LN_PRED(A2)
  2311.     MOVE.L    A1,(A0)
  2312.     BRA.S    .END
  2313.  
  2314. .EMPTYLIST
  2315.     MOVE.L    (A0),(A1)
  2316.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2317.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2318.     MOVE.L    A1,LH_TAILPRED(A0)    ;ELEMENT IS ALSO LAST ONE
  2319. .END    MOVE.L    (A7)+,A2
  2320.     RTS
  2321.  
  2322. _ADDTAIL
  2323.     MOVE.L    A2,-(A7)
  2324.     MOVE.L    (A0),A2
  2325.     TST.L    (A2)
  2326.     BEQ.S    .EMPTYLIST
  2327.     MOVE.L    LH_TAILPRED(A0),A2
  2328.  
  2329.     MOVE.L    (A2),(A1)
  2330.     MOVE.L    A2,LN_PRED(A1)
  2331.     MOVE.L    A1,LH_TAILPRED(A0)
  2332.     MOVE.L    A1,(A2)
  2333.     BRA.S    .END
  2334.  
  2335. .EMPTYLIST
  2336.     MOVE.L    (A0),(A1)
  2337.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2338.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2339.     MOVE.L    A1,LH_TAILPRED(A0)
  2340. .END    MOVE.L    (A7)+,A2
  2341.     RTS
  2342.  
  2343. _REMOVE        ;A1-NODE TO REMOVE
  2344.     MOVEM.L    A2,-(A7)
  2345.     MOVE.L    A1,A2
  2346. .HSEARCH
  2347.     TST.L    4(A2)
  2348.     BEQ.S    .HFOUND
  2349.     MOVE.L    4(A2),A2
  2350.     BRA.S    .HSEARCH
  2351.  
  2352. .HFOUND
  2353.     MOVE.L    (A1),A0
  2354.     TST.L    (A0)
  2355.     BEQ.S    .REMTAIL
  2356.     CMP.L    (A2),A1
  2357.     BEQ.S    .REMHEAD
  2358.  
  2359.     MOVE.L    LN_PRED(A1),A0
  2360.     MOVE.L    (A1),(A0)
  2361.     MOVE.L    (A1),A0
  2362.     MOVE.L    LN_PRED(A1),LN_PRED(A0)
  2363. .END    MOVEM.L    (A7)+,A2
  2364.     RTS
  2365.  
  2366. .REMHEAD
  2367.     MOVE.L    A2,A0
  2368.     BSR.S    _REMHEAD
  2369.     BRA.S    .END
  2370.  
  2371. .REMTAIL
  2372.     MOVE.L    A2,A0
  2373.     BSR.S    _REMTAIL
  2374.     BRA.S    .END
  2375.  
  2376. _REMHEAD
  2377.     MOVE.L    (A0),A1
  2378.     TST.L    (A1)
  2379.     BEQ.S    .EMPTYLIST
  2380.     MOVE.L    A2,-(A7)
  2381.     MOVE.L    (A0),A2
  2382.     MOVE.L    A2,D0
  2383.     MOVE.L    (A2),-(A7)
  2384.     TST.L    (A7)+
  2385.     BEQ.S    .SINGLEELEMENT
  2386.     MOVE.L    LN_PRED(A2),D1
  2387.     MOVE.L    (A2),A2
  2388.     MOVE.L    D1,LN_PRED(A2)
  2389.     MOVE.L    A2,(A0)
  2390.     MOVE.L    (A7)+,A2
  2391.     RTS
  2392.  
  2393. .SINGLEELEMENT
  2394.     MOVE.L    (A0),A2
  2395.     MOVE.L    (A2),(A0)
  2396.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2397.     MOVE.L    (A7)+,A2
  2398.     RTS
  2399.  
  2400. .EMPTYLIST
  2401.     MOVEQ.L    #0,D0
  2402.     RTS
  2403.  
  2404. _REMTAIL
  2405.     MOVE.L    (A0),A1
  2406.     TST.L    (A1)
  2407.     BEQ.S    .EMPTYLIST
  2408.     MOVE.L    A2,-(A7)
  2409.     MOVE.L    LH_TAILPRED(A0),A2
  2410.     MOVE.L    (A2),-(A7)
  2411.     TST.L    (A7)+
  2412.     BEQ.S    .SINGLEELEMENT
  2413.     MOVE.L    A2,D0
  2414.     MOVE.L    (A2),D1
  2415.     MOVE.L    LN_PRED(A2),A2
  2416.     MOVE.L    D1,(A2)
  2417.     MOVE.L    A2,LH_TAILPRED(A0)
  2418.     MOVE.L    (A7)+,A2
  2419.     RTS
  2420.  
  2421. .SINGLEELEMENT
  2422.     MOVE.L    A2,D0
  2423.     MOVE.L    (A2),(A0)
  2424.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2425.     MOVE.L    (A7)+,A2
  2426.     RTS
  2427.  
  2428. .EMPTYLIST
  2429.     MOVEQ.L    #0,D0
  2430.     RTS
  2431.  
  2432. ****************************************************************************
  2433. * INTERRUPTPART IN EXEC                                                    *
  2434. ****************************************************************************
  2435.  
  2436. INT_68        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2437.         move.w    (_custom+intreqr),d0
  2438.         and.w    #INTF_PORTS,d0
  2439.         beq    .ports_end
  2440.  
  2441.     ;call handler/server
  2442. .ports        PEA    .ports_cont(PC)
  2443.         move.l    (4).W,a1
  2444.         MOVE.L    (IVPORTS+IV_CODE,A1),-(A7)
  2445.         move.l    (IVPORTS+IV_DATA,a1),a1
  2446.         RTS
  2447. .ports_cont
  2448. .ports_end
  2449.         move.w    #INTF_PORTS,(_custom+intreq)
  2450.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2451.         rte
  2452.  
  2453. INTSERVNODE_CIAA
  2454.         dc.l    0        ;LN_SUCC
  2455.         dc.l    0        ;LN_PRED
  2456.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2457.         dc.b    120        ;LN_PRI
  2458.         dc.l    _ciaaname    ;LN_NAME
  2459.         dc.l    0        ;IS_DATA
  2460.         dc.l    INT_CIAA    ;IS_CODE
  2461.  
  2462. ;---------------
  2463.  
  2464. INT_6c        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2465.         move.w    (_custom+intreqr),d0
  2466.         and.w    #INTF_VERTB,d0
  2467.         beq    .vertb_end
  2468.  
  2469. .vertb
  2470.     ;timer++
  2471.  
  2472.     add.l    #20,millisec_timer
  2473.     cmp.l    #1000,millisec_timer
  2474.     bcs    .skip
  2475.  
  2476.     addq.l    #1,sec_timer
  2477.     clr.l    millisec_timer
  2478. .skip
  2479.     ;set copperlist (this should be the first !)
  2480.         move.l    _gfxbase(PC),a0
  2481.         move.l    (gb_LOFlist,a0),(_custom+cop2lc)
  2482.  ifeq 1
  2483.     ;set sprites
  2484.         tst.b    (gb_SpriteReserved,a0)
  2485.         beq    .ns
  2486.         lea    (_sprites),a0
  2487.         lea    (_custom+sprpt),a1
  2488.         moveq    #7,d0
  2489. .ss        move.l    (a0)+,(a1)+
  2490.         dbf    d0,.ss
  2491. .ns
  2492.  endc
  2493.     ;call handler/server
  2494.         PEA    .vertb_cont(PC)
  2495.         move.l    (4).W,a1
  2496.         MOVE.L    (IVVERTB+IV_CODE,A1),-(A7)
  2497.         move.l    (IVVERTB+IV_DATA,a1),a1
  2498.         RTS
  2499. .vertb_cont
  2500.     ;input handler
  2501.         move.l    _inputhandler(PC),d0
  2502.         beq    .vertb_end
  2503.         moveq    #$6c,d0
  2504.         bsr    _InputHandlerVBI
  2505. .vertb_end
  2506.         move.w    #INTF_BLIT!INTF_VERTB!INTF_COPER,(_custom+intreq)
  2507.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2508.         rte
  2509.  
  2510. ;---------------
  2511.  
  2512. INT_70        movem.l    d0-d1/D6/a0-a1/a5-a6,-(a7)
  2513.         move.w    (_custom+intreqr),d6
  2514.         and.w    #INTF_AUD0!INTF_AUD1!INTF_AUD2!INTF_AUD3,d6
  2515.         BTST    #7,D6
  2516.         BEQ.S    .AUD1
  2517.  
  2518.     ;call handler/server
  2519.         PEA    .aud0_cont(PC)
  2520.         move.l    (4).W,a1
  2521.         MOVE.L    (IVAUD0+IV_CODE,A1),-(A7)
  2522.         move.l    (IVAUD0+IV_DATA,a1),a1
  2523.         RTS
  2524.  
  2525. .aud0_cont    move.w    #INTF_AUD0,(_custom+intreq)
  2526.         BCLR    #7,D6
  2527.  
  2528. .AUD1        BTST    #8,D6
  2529.         BEQ.S    .AUD2
  2530.  
  2531.     ;call handler/server
  2532.         PEA    .aud1_cont(PC)
  2533.         move.l    (4).W,a1
  2534.         MOVE.L    (IVAUD1+IV_CODE,A1),-(A7)
  2535.         move.l    (IVAUD1+IV_DATA,a1),a1
  2536.         RTS
  2537.  
  2538. .aud1_cont    MOVE.W    #INTF_AUD1,(_custom+intreq)
  2539.         BCLR    #8,D6
  2540.  
  2541. .AUD2        BTST    #9,D6
  2542.         BEQ.S    .AUD3
  2543.  
  2544.     ;call handler/server
  2545.         PEA    .aud2_cont(PC)
  2546.         move.l    (4).W,a1
  2547.         MOVE.L    (IVAUD2+IV_CODE,A1),-(A7)
  2548.         move.l    (IVAUD2+IV_DATA,a1),a1
  2549.         RTS
  2550.  
  2551. .aud2_cont    MOVE.W    #INTF_AUD2,(_custom+intreq)
  2552.         BCLR    #9,D6
  2553.  
  2554. .AUD3        BTST    #$A,D6
  2555.         BEQ.S    .aud_end
  2556.  
  2557.     ;call handler/server
  2558.         PEA    .aud3_cont(PC)
  2559.         move.l    (4).W,a1
  2560.         MOVE.L    (IVAUD3+IV_CODE,A1),-(A7)
  2561.         move.l    (IVAUD3+IV_DATA,a1),a1
  2562.         RTS
  2563.  
  2564. .aud3_cont    MOVE.W    #INTF_AUD3,(_custom+intreq)
  2565.         BCLR    #$A,D6
  2566.  
  2567. .aud_end    movem.l    (a7)+,d0-d1/D6/a0-a1/a5-a6
  2568.         rte
  2569.  
  2570. INTSERVNODE_AUDIO0
  2571.         dc.l    0        ;LN_SUCC
  2572.         dc.l    0        ;LN_PRED
  2573.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2574.         dc.b    120        ;LN_PRI
  2575.         dc.l    0        ;LN_NAME
  2576.         dc.l    0        ;IS_DATA
  2577.         dc.l    _AUD0_CODE    ;IS_CODE
  2578.  
  2579. INTSERVNODE_AUDIO1
  2580.         dc.l    0        ;LN_SUCC
  2581.         dc.l    0        ;LN_PRED
  2582.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2583.         dc.b    120        ;LN_PRI
  2584.         dc.l    0        ;LN_NAME
  2585.         dc.l    0        ;IS_DATA
  2586.         dc.l    _AUD1_CODE    ;IS_CODE
  2587.  
  2588. INTSERVNODE_AUDIO2
  2589.         dc.l    0        ;LN_SUCC
  2590.         dc.l    0        ;LN_PRED
  2591.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2592.         dc.b    120        ;LN_PRI
  2593.         dc.l    0        ;LN_NAME
  2594.         dc.l    0        ;IS_DATA
  2595.         dc.l    _AUD2_CODE    ;IS_CODE
  2596.  
  2597. INTSERVNODE_AUDIO3
  2598.         dc.l    0        ;LN_SUCC
  2599.         dc.l    0        ;LN_PRED
  2600.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2601.         dc.b    120        ;LN_PRI
  2602.         dc.l    0        ;LN_NAME
  2603.         dc.l    0        ;IS_DATA
  2604.         dc.l    _AUD3_CODE    ;IS_CODE
  2605.  
  2606. _AUD0_CODE
  2607. _AUD1_CODE
  2608. _AUD2_CODE
  2609. _AUD3_CODE
  2610.         RTS
  2611.  
  2612.  
  2613. ;---------------
  2614.  
  2615. INT_78        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2616.         move.w    (_custom+intreqr),d0
  2617.         and.w    #INTF_EXTER,d0
  2618.         beq    .exter_end
  2619.  
  2620.     ;call handler/server
  2621. .exter        PEA    .exter_cont(PC)
  2622.         move.l    (4).W,a1
  2623.         MOVE.L    (IVEXTER+IV_CODE,A1),-(A7)
  2624.         move.l    (IVEXTER+IV_DATA,a1),a1
  2625.         RTS
  2626. .exter_cont
  2627. .exter_end
  2628.         move.w    #INTF_EXTER,(_custom+intreq)
  2629.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2630.         rte
  2631.  
  2632. INTSERVNODE_CIAB
  2633.         dc.l    0        ;LN_SUCC
  2634.         dc.l    0        ;LN_PRED
  2635.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2636.         dc.b    120        ;LN_PRI
  2637.         dc.l    _ciabname    ;LN_NAME
  2638.         dc.l    0        ;IS_DATA
  2639.         dc.l    INT_CIAB    ;IS_CODE
  2640.  
  2641. ;---------------
  2642.  
  2643. INT_SERVER
  2644.         move.l    (IV_NODE,a1),-(a7)
  2645. .loop        move.l    (a7),d0
  2646.         beq    .end
  2647.         move.l    d0,a0
  2648.         move.l    (LN_SUCC,a0),(a7)
  2649.         move.l    (IS_DATA,a0),a1
  2650.         TST.L    (IS_CODE,A0)
  2651.         BEQ.S    .loop
  2652.         move.l    (IS_CODE,a0),a6
  2653.         pea    (.loop)
  2654.         lea    (_custom),a0    ;some require this
  2655.         jmp    (a6)
  2656. .end        addq.l    #4,a7
  2657.         rts
  2658.  
  2659. ;---------------
  2660.  
  2661. _SETINTVECTOR    ;D0-INT#, A1-INTERRUPTNODE, RET D0-OLD INTERRUPTNODE
  2662.         CMP.L    #$7,D0
  2663.         BLO.S    .NOTSUPPORTED
  2664.         CMP.L    #$B,D0
  2665.         BHS.S    .NOTSUPPORTED
  2666.         MULU    #$C,D0
  2667.         MOVE.L    4.W,A0
  2668.         LEA.L    IntVects(A0,D0.L),A0
  2669.         MOVE.L    IV_NODE(A0),D0
  2670.         MOVE.L    A1,IV_NODE(A0)
  2671.         RTS
  2672.  
  2673. .NOTSUPPORTED    pea    _LVOSetIntVector
  2674.         pea    _execname
  2675.         bra    _emufail
  2676.  
  2677.  
  2678. _AddIntServer    ;d0=intnumber a1=interrupt
  2679.  
  2680.         movem.l    a2-a4,-(a7)
  2681.         mulu    #IV_SIZE,D0
  2682.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2683.         move.w    #INTF_INTEN,(_custom+intena)
  2684.  
  2685.         move.b    (LN_PRI,a1),d1            ;d1 = priority
  2686.         sub.l    a3,a3                ;a3 = predecessor
  2687.         move.l    (a2),a4                ;a4 = successor
  2688.  
  2689. .next        move.l    a4,d0
  2690.         beq    .hangin
  2691.         cmp.b    (LN_PRI,a4),d1
  2692.         bgt    .hangin
  2693.         move.l    a4,a3
  2694.         move.l    (LN_SUCC,a3),a4
  2695.         bra    .next
  2696.  
  2697. .hangin        move.l    a3,(LN_PRED,a1)
  2698.         bne    .hi1
  2699.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2700. .hi1        move.l    a1,(LN_SUCC,a3)
  2701.         move.l    a4,(LN_SUCC,a1)
  2702.         beq    .hi2
  2703.         move.l    a1,(LN_PRED,a4)
  2704. .hi2
  2705. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2706.         movem.l    (a7)+,a2-a4
  2707.         rts
  2708.  
  2709.  ifeq 1
  2710.     MOVE.L    D2,-(A7)
  2711.     MOVE.L    D0,D2
  2712.     MOVE.L    D0,D1
  2713.     MULU.W    #IV_SIZE,D0
  2714.     LEA       (IntVects,A6,D0.W),A0
  2715.     MOVE.L    (A0),A0
  2716.     MOVE.W    #INTF_INTEN,(_custom+intena)
  2717.     ADDQ.B    #1,(IDNestCnt,A6)
  2718.     BSR.W     _Enqueue
  2719.     MOVE.W    #-$8000,D0
  2720.     BSET      D2,D0
  2721.     MOVE.W    D0,(_custom+intena)
  2722.     SUBQ.B    #1,(IDNestCnt,A6)
  2723.     BGE.S     .1654
  2724.     MOVE.W    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2725. .1654    MOVE.L    (A7)+,D2
  2726.     RTS
  2727.  endc
  2728.  
  2729. _RemIntServer    ;d0=intnumber a1=interrupt
  2730.  
  2731.     ;this is a workaround for Millenium2·2, which does not set D0 correctly
  2732.         cmp.l    #$20,d0
  2733.         blo    .ok
  2734.         moveq    #5,d0
  2735. .ok
  2736.         movem.l    a2-a4,-(a7)
  2737.         mulu    #IV_SIZE,D0
  2738.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2739.         move.w    #INTF_INTEN,(_custom+intena)
  2740.  
  2741.         sub.l    a3,a3                ;a3 = predecessor
  2742.         move.l    a2,a0
  2743.         
  2744. .next        move.l    (LN_SUCC,a0),a0
  2745.         cmp.l    a0,a1
  2746.         beq    .hangout
  2747.         move.l    a0,a3
  2748.         bra    .next
  2749.  
  2750. .hangout    move.l    (LN_SUCC,a1),a4            ;a4 = successor
  2751.         move.l    a4,d0
  2752.         beq    .ho1
  2753.         move.l    a3,(LN_PRED,a4)
  2754. .ho1        move.l    a3,d0
  2755.         bne    .ho2
  2756.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2757. .ho2        move.l    a4,(LN_SUCC,a3)
  2758.  
  2759. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2760.         movem.l    (a7)+,a2-a4
  2761.         rts
  2762.  
  2763. _ExitIntr    MOVEM.L    (A7)+,D0-D1/A0-A1/A5-A6
  2764.         RTE
  2765.  
  2766. **************************************************************************
  2767. *   LIBRARY FUNCTIONS                                                    *
  2768. **************************************************************************
  2769.  
  2770. OPENLIB        move.l    a2,-(a7)
  2771.  
  2772.         lea    _libtable,a2
  2773. .next        move.l    (a2)+,a0
  2774.         move.l    a0,d0
  2775.         beq    .err
  2776.         bsr    _strcmp
  2777.         beq    .found
  2778.         addq.l    #4,a2
  2779.         bra    .next
  2780.  
  2781. .found        move.l    (a2),a0
  2782.         jsr    (a0)        ;init
  2783.         
  2784.         move.l    (a7)+,a2
  2785.         rts
  2786.  
  2787. .err        pea    _LVOOpenLibrary
  2788.         pea    _execname
  2789.         bra    _emufail
  2790.  
  2791. **************************************************************************
  2792. *   DEVICE FUNCTIONS                                                     *
  2793. **************************************************************************
  2794.  
  2795. _OpenDevice    ;a0=name d0=unit a1=ioreq d1=flags
  2796.         moveM.l    D0/A0-a2,-(a7)
  2797.  
  2798.         MOVE.L    A0,A1
  2799.         lea    _devtable,a2
  2800. .next        move.l    (a2)+,a0
  2801.         move.l    a0,d0
  2802.         beq    .err
  2803.         bsr    _strcmp
  2804.         beq    .found
  2805.         addq.l    #4,a2
  2806.         bra    .next
  2807.  
  2808. .err        pea    _LVOOpenDevice
  2809.         pea    _execname
  2810.         bra    _emufail
  2811.  
  2812. .found
  2813.     cmp.l    #"cd.d",(A0)        ; but what with A0 if will odd address (68000)
  2814.         beq    .dontopen    ; added by JOTD
  2815.  
  2816.         MOVE.L    8(A7),A1
  2817.     IFNE    CORRECTDEVICES
  2818.         MOVE.L    (A2),(IO_DEVICE,A1)
  2819.     ELSE
  2820.         move.l    (a0),(IO_DEVICE,a1)
  2821.     ENDC
  2822.         move.l    (A7),(IO_UNIT,a1)
  2823.         move.b    d1,(IO_FLAGS,A1)
  2824.         MOVEM.L    (A7)+,D0/A0-A2
  2825.         moveq    #0,d0
  2826.         move.b    d0,(IO_ERROR,a1)
  2827.         rts
  2828.  
  2829. .dontopen
  2830.         MOVEM.L    (A7)+,D0/A0-A2
  2831.         moveq.l    #-1,D0
  2832.         rts
  2833.  
  2834. _InputHandlerVBI
  2835.     ;check LMB
  2836.         btst    #CIAB_GAMEPORT0,(_ciaa+ciapra)
  2837.         seq    d0
  2838.         cmp.b    (_last_lmb),d0
  2839.         beq    .lmbend
  2840.         move.b    d0,(_last_lmb)
  2841.         lea    _inputevent,a0
  2842.         clr.l    (ie_NextEvent,a0)
  2843.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2844.         clr.b    (ie_SubClass,a0)
  2845.         move.w    #IECODE_LBUTTON,(ie_Code,a0)
  2846.         tst.b    d0
  2847.         bne    .lmb1
  2848.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2849. .lmb1        moveq    #0,d0
  2850.         move.b    (_last_lmb),d1
  2851.         beq    .lmb2
  2852.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2853. .lmb2        move.b    (_last_rmb),d1
  2854.         beq    .lmb3
  2855.         or.w    #IEQUALIFIER_RBUTTON,d0
  2856. .lmb3        move.w    d0,(ie_Qualifier,a0)
  2857.         pea    .lmbend
  2858.         move.l    _inputhandler,a1
  2859.         move.l    (IS_CODE,a1),-(a7)
  2860.         move.l    (IS_DATA,a1),a1
  2861.         rts                    ;a0=InputEvent a1=HandlerData
  2862. .lmbend
  2863.     ;check RMB
  2864.         btst    #POTGOB_DATLY-8,(_custom+potinp)
  2865.         seq    d0
  2866.         cmp.b    (_last_rmb),d0
  2867.         beq    .rmbend
  2868.         move.b    d0,(_last_rmb)
  2869.         lea    _inputevent,a0
  2870.         clr.l    (ie_NextEvent,a0)
  2871.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2872.         clr.b    (ie_SubClass,a0)
  2873.         move.w    #IECODE_RBUTTON,(ie_Code,a0)
  2874.         tst.b    d0
  2875.         bne    .rmb1
  2876.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2877. .rmb1        moveq    #0,d0
  2878.         move.b    (_last_lmb),d1
  2879.         beq    .rmb2
  2880.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2881. .rmb2        move.b    (_last_rmb),d1
  2882.         beq    .rmb3
  2883.         or.w    #IEQUALIFIER_RBUTTON,d0
  2884. .rmb3        move.w    d0,(ie_Qualifier,a0)
  2885.         pea    .rmbend
  2886.         move.l    _inputhandler,a1
  2887.         move.l    (IS_CODE,a1),-(a7)
  2888.         move.l    (IS_DATA,a1),a1
  2889.         rts                    ;a0=InputEvent a1=HandlerData
  2890. .rmbend
  2891.     ;check MouseMove
  2892.         move.w    (_custom+joy0dat),d0
  2893.         move.w    (_last_joy0dat),d1
  2894.         cmp.w    d0,d1
  2895.         beq    .rts
  2896.         move.w    d0,(_last_joy0dat)
  2897.         lea    _inputevent,a0
  2898.         clr.l    (ie_NextEvent,a0)
  2899.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2900.         clr.b    (ie_SubClass,a0)
  2901.         move.w    #IECODE_NOBUTTON,(ie_Code,a0)
  2902.         clr.w    (ie_Qualifier,a0)
  2903.         movem.l    d2-d3,-(a7)
  2904.         moveq    #0,d2
  2905.         move.b    d1,d2
  2906.         moveq    #0,d3
  2907.         move.b    d0,d3
  2908.         sub.w    d2,d3
  2909.         cmp.w    #127,d3
  2910.         bgt    .xsub
  2911.         cmp.w    #-128,d3
  2912.         bge    .xok
  2913.         add.w    #512,d3
  2914. .xsub        sub.w    #256,d3
  2915. .xok        move.w    d3,(ie_X,a0)
  2916.         movem.l    (a7)+,d2-d3
  2917.         lsr.w    #8,d0
  2918.         lsr.w    #8,d1
  2919.         sub.w    d1,d0
  2920.         cmp.w    #127,d0
  2921.         bgt    .ysub
  2922.         cmp.w    #-128,d0
  2923.         bge    .yok
  2924.         add.w    #512,d0
  2925. .ysub        sub.w    #256,d0
  2926. .yok        move.w    d0,(ie_Y,a0)
  2927.         move.l    _inputhandler,a1
  2928.         move.l    (IS_CODE,a1),-(a7)
  2929.         move.l    (IS_DATA,a1),a1
  2930. .rts        rts                    ;a0=InputEvent a1=HandlerData
  2931.  
  2932. _InputHandlerPI    lea    _inputevent,a0
  2933.         clr.l    (ie_NextEvent,a0)
  2934.         move.b    #IECLASS_RAWKEY,(ie_Class,a0)
  2935.         clr.b    (ie_SubClass,a0)
  2936.         moveq    #0,d0
  2937.         move.b    (KBDVAL),d0
  2938.         move.w    d0,(ie_Code,a0)
  2939.         clr.w    (ie_Qualifier,a0)
  2940.         move.l    _inputhandler,a1
  2941.         move.l    (IS_CODE,a1),-(a7)
  2942.         move.l    (IS_DATA,a1),a1
  2943.         rts                    ;a0=InputEvent a1=HandlerData
  2944.  
  2945. _SendIO
  2946. _DoIO        ;a1=ioreq
  2947.         tst.l    (IO_DEVICE,A1)
  2948.         beq    .cd                ; not found: ignore! (JOTD)
  2949.  
  2950.         move.w    (IO_COMMAND,a1),d0        ;d0=command
  2951.     IFNE    CORRECTDEVICES
  2952.         MOVE.L    _tddevtable+4(PC),D1
  2953.         CMP.L    (IO_DEVICE,A1),D1
  2954.     ELSE
  2955.         cmp.l    #"trac",(IO_DEVICE,a1)
  2956.     ENDC
  2957.         beq    .trackdisk
  2958.     IFNE    CORRECTDEVICES
  2959.         MOVE.L    _inpdevtable+4(PC),D1
  2960.         CMP.L    (IO_DEVICE,A1),D1
  2961.     ELSE
  2962.         cmp.l    #"inpu",(IO_DEVICE,a1)
  2963.     ENDC
  2964.         beq    .input
  2965.  
  2966.     ; cd.device added by Jeff
  2967.  
  2968.     IFNE    CORRECTDEVICES
  2969.         MOVE.L    _cddevtable+4(PC),D1
  2970.         CMP.L    (IO_DEVICE,A1),D1
  2971.     ELSE
  2972.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  2973.     ENDC
  2974.         beq    .cd
  2975.  
  2976.     ; cdtv.device added by Jeff
  2977.  
  2978.     IFNE    CORRECTDEVICES
  2979.         MOVE.L    _cdtvdevtable+4(PC),D1
  2980.         CMP.L    (IO_DEVICE,A1),D1
  2981.     ELSE
  2982.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  2983.     ENDC
  2984.         beq    .cd
  2985.  
  2986.     ; keyboard.device added by Jeff
  2987.  
  2988.     IFNE    CORRECTDEVICES
  2989.         MOVE.L    _kbdevtable+4(PC),D1
  2990.         CMP.L    (IO_DEVICE,A1),D1
  2991.     ELSE
  2992.         cmp.l    #"keyb",(IO_DEVICE,a1)
  2993.     ENDC
  2994.         beq    .keyboard
  2995.  
  2996. .fail
  2997.     move.l    D0,D6
  2998.  
  2999.         pea    _LVODoIO
  3000.         pea    _execname
  3001.         bra    _emufail
  3002.         
  3003. .cd
  3004.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3005.         rts
  3006.  
  3007. .keyboard
  3008.         cmp.w    #KBD_READMATRIX,d0
  3009.         beq    .kb_readmatrix
  3010.         cmp.w    #KBD_READEVENT,d0
  3011.  
  3012.         cmp.w    #CMD_CLEAR,d0
  3013.  
  3014.         BRA    .fail
  3015. .kb_readmatrix
  3016.         move.l    a1,-(SP)
  3017.         moveq    #15,d0
  3018.         move.l    (IO_LENGTH,a1),d1
  3019.         move.l    (IO_DATA,a1),a0
  3020.         cmp.l    d0,d1
  3021.         bls.s    .lower
  3022.         move.w    d0,d1
  3023. .lower
  3024.         move.l    d1,(IO_ACTUAL,a1)
  3025.         move.l    (IO_DEVICE,a1),a1
  3026.         lea    $136(a1),a1
  3027.         bra.s    .goto
  3028. .loop
  3029.         move.b    (a1)+,(a0)+
  3030. .goto
  3031.         dbra    d1,.loop
  3032.         movea.l    (SP)+,a1
  3033.  
  3034.         clr.b    (IO_ERROR,a1)
  3035.         moveq.l    #0,d0
  3036.         rts
  3037.  
  3038. .input        cmp.w    #CMD_RESET,d0
  3039.         beq    .ret
  3040.         cmp.w    #IND_ADDHANDLER,d0
  3041.         beq    .i_addh
  3042.         cmp.w    #IND_REMHANDLER,d0
  3043.         beq    .i_remh
  3044.         cmp.w    #IND_SETMPORT,d0
  3045.         beq    .ret
  3046.         cmp.w    #IND_SETMTRIG,d0
  3047.         beq    .i_setmtrig
  3048.         BRA    .fail
  3049.  
  3050. .i_addh        move.w    (_custom+joy0dat),(_last_joy0dat)
  3051.         TST.L    _inputhandler
  3052.         BNE    .fail
  3053.         move.l    (IO_DATA,a1),_inputhandler
  3054.         moveq.l    #0,D0            ; added by JOTD
  3055.         rts
  3056. .i_remh        clr.l    _inputhandler
  3057.         rts
  3058. .i_setmtrig    move.l    (IO_DATA,a1),.gpt
  3059.         moveq.l    #0,D0            ; added by JOTD
  3060.         rts
  3061. .gpt        dc.l    0
  3062.  
  3063. .trackdisk    cmp.w    #CMD_READ,d0
  3064.         beq    .td_read
  3065.         cmp.w    #CMD_CLEAR,d0
  3066.         beq    .ret
  3067.         cmp.w    #TD_MOTOR,d0
  3068.         beq    .ret
  3069.         cmp.w    #TD_FORMAT,d0
  3070.         beq    .td_write
  3071.         cmp.w    #TD_REMOVE,d0
  3072.         beq    .ret
  3073.         cmp.w    #TD_CHANGENUM,d0
  3074.         beq    .ret
  3075.         cmp.w    #TD_CHANGESTATE,d0
  3076.         beq    .ret
  3077.         cmp.w    #ETD_SEEK,d0
  3078.         beq    .td_seek    ; added by JOTD
  3079.         cmp.w    #TD_SEEK,d0
  3080.         beq    .td_seek    ; added by JOTD
  3081.         cmp.w    #ETD_READ,d0
  3082.         beq    .td_read
  3083.         cmp.w    #ETD_WRITE,d0
  3084.         beq    .td_write
  3085.         cmp.w    #CMD_WRITE,d0
  3086.         beq    .td_write    ; added by JOTD
  3087.         cmp.w    #ETD_UPDATE,d0
  3088.         beq    .ret
  3089.         cmp.w    #ETD_CLEAR,d0
  3090.         beq    .ret
  3091.         cmp.w    #ETD_MOTOR,d0
  3092.         beq    .ret
  3093.         cmp.w    #CMD_UPDATE,d0    ; added by JOTD
  3094.         beq    .ret
  3095.         BRA.W    .fail
  3096.  
  3097. .td_seek:    ; seek only moves the heads, nothing is read!
  3098.         beq    .ret
  3099.  
  3100.     ;"deuteros" expects that a1 is unchanged !
  3101. .td_read    movem.l    d2/a1,-(a7)
  3102.         move.l    (IO_OFFSET,a1),d0
  3103.         move.l    (IO_LENGTH,a1),d1
  3104.         move.l    d1,(IO_ACTUAL,a1)    ; Mr.Larmer
  3105.         move.l    (IO_UNIT,a1),d2
  3106.         addq.l    #1,d2
  3107.         move.l    (IO_DATA,a1),a0
  3108.         move.l    (_RESLOAD),a1
  3109.         jsr    (resload_DiskLoad,a1)
  3110.         movem.l    (a7)+,d2/a1
  3111. .ret        clr.b    (IO_ERROR,a1)
  3112.         moveq.l    #0,D0            ; added by JOTD
  3113.         rts
  3114.  
  3115. .td_write    tst.l    _p3    ; JOTD: what's this ???
  3116.         bne.b    .td_dowrite
  3117.         move.l    OSM_JSTFLAGS,D0
  3118.         btst    #AFB_NOOSSWAP,D0    ; JST's NOOSSWAP set
  3119.         bne.b    .f            ; don't write!
  3120. .td_dowrite
  3121.         movem.l    a1-a2,-(a7)
  3122.         clr.b    (IO_ERROR,a1)
  3123.         move.l    (IO_LENGTH,a1),d0    ;size
  3124.         lea    (.disk),a0
  3125.         move.l    (IO_UNIT,a1),d1
  3126.         add.b    #"1",d1
  3127.         move.b    d1,(5,a0)        ;name
  3128.         move.l    (IO_OFFSET,a1),d1    ;offset
  3129.         move.l    (IO_DATA,a1),a1        ;address
  3130.         move.l    (_RESLOAD),a2
  3131.         jsr    (resload_SaveFileOffset,a2)
  3132.         movem.l    (a7)+,a1-a2
  3133.         rts
  3134. .f        st    (IO_ERROR,a1)
  3135.         rts
  3136.  
  3137. .disk        dc.b    "Disk.",0,0,0
  3138.  
  3139. _SENDAUDIO
  3140.         CLR.B    IO_ERROR(A1)
  3141.         MOVEQ.L    #0,D0
  3142.         RTS
  3143.  
  3144. _WAITIO
  3145.     IFNE    CORRECTDEVICES
  3146.         MOVE.L    _cddevtable+4(PC),D1
  3147.         CMP.L    (IO_DEVICE,A1),D1
  3148.     ELSE
  3149.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  3150.     ENDC
  3151.         beq    .cd
  3152.  
  3153.     IFNE    CORRECTDEVICES
  3154.         MOVE.L    _cdtvdevtable+4(PC),D1
  3155.         CMP.L    (IO_DEVICE,A1),D1
  3156.     ELSE
  3157.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  3158.     ENDC
  3159.         beq    .cd
  3160.  
  3161. .fail        pea    _LVOWaitIO
  3162.         pea    _execname
  3163.         bra    _emufail
  3164.         
  3165. .cd
  3166.         CLR.B    IO_ERROR(A1)
  3167.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3168.         RTS
  3169.  
  3170. _ABORTIO
  3171.         CLR.B    IO_ERROR(A1)
  3172.         MOVEQ.L    #0,D0
  3173.         RTS
  3174.  
  3175. _CHECKIO
  3176.         MOVE.L    A1,D0    ; request has completed
  3177.         RTS
  3178.  
  3179. **************************************************************************
  3180. *   RESOURCE FUNCTIONS                                                   *
  3181. **************************************************************************
  3182.  
  3183. OPENRES        move.l    a2,-(a7)
  3184.  
  3185.         lea    _restable,a2
  3186. .next        move.l    (a2)+,a0
  3187.         move.l    a0,d0
  3188.         beq    .err
  3189.         bsr    _strcmp
  3190.         beq    .found
  3191.         addq.l    #4,a2
  3192.         bra    .next
  3193.  
  3194. .found        move.l    (a2),a0
  3195.         jsr    (a0)        ;init
  3196.         
  3197.         move.l    (a7)+,a2
  3198.         rts
  3199.  
  3200. .err        pea    _LVOOpenResource
  3201.         pea    _execname
  3202.         bra    _emufail
  3203.  
  3204. **************************************************************************
  3205. *   DISK.RESOURCE                                                        *
  3206. **************************************************************************
  3207.  
  3208. DISKINIT    move.l    _diskbase,d0
  3209.         beq    .init
  3210.         rts
  3211.  
  3212. .init
  3213.         move.l    #-_LVOReadUnitID,D0
  3214.         move.l    #5*4,d1
  3215.         lea    _diskname,a0
  3216.         bsr    _InitStruct
  3217.         move.l    d0,_diskbase
  3218.         move.l    d0,a0
  3219.  
  3220.         ; patches
  3221.  
  3222.         patch    _LVOGetUnit(a0),GETUNIT(pc)
  3223.  
  3224.         ; clears interrupt structure
  3225.  
  3226.         clr.l    (a0)+
  3227.         clr.l    (a0)+
  3228.         clr.l    (a0)+
  3229.         clr.l    (a0)+
  3230.         clr.l    (a0)
  3231.  
  3232.  
  3233.         rts
  3234.  
  3235. GETUNIT:
  3236.     moveq.l    #-1,d0        ; not exactly the thing to do but...
  3237.     rts
  3238.  
  3239.  
  3240. **************************************************************************
  3241. *   CIAA.RESOURCE                                                        *
  3242. **************************************************************************
  3243.  
  3244. CIAAINIT    move.l    _ciaabase,d0
  3245.         beq    .init
  3246.         rts
  3247.  
  3248. .init        move.l    #-_LVOSetICR,d0
  3249.         move.l    #5*4,d1
  3250.         lea    _ciaaname,a0
  3251.         bsr    _InitStruct
  3252.         move.l    d0,a0
  3253.         move.l    d0,_ciaabase
  3254.  
  3255.         patch    _LVOAddICRVector(a0),ADDICRV(pc)
  3256.         patch    _LVORemICRVector(a0),REMICRV(pc)
  3257.  
  3258.         clr.l    (a0)+
  3259.         clr.l    (a0)+
  3260.         clr.l    (a0)+
  3261.         move.l    #INTSERVNODE_SP,(a0)+
  3262.         clr.l    (a0)
  3263.  
  3264.         MOVE.B    #$FF,$BFE701
  3265.  
  3266.         rts
  3267.  
  3268. INTSERVNODE_SP    dc.l    0        ;LN_SUCC
  3269.         dc.l    0        ;LN_PRED
  3270.         dc.b    NT_INTERRUPT    ;LN_TYPE
  3271.         dc.b    0        ;LN_PRI
  3272.         dc.l    0        ;LN_NAME
  3273.         dc.l    0        ;IS_DATA
  3274.         dc.l    INT_KBD        ;IS_CODE
  3275.  
  3276. INT_KBD
  3277.         movem.l    D2-D4/A6,-(SP)
  3278.         movea.l    A1,A6
  3279.         moveq    #0,D2
  3280.         move.b    $BFEC01,D2
  3281.  
  3282.         MOVE.B    #$41,$BFEE01
  3283.  
  3284. ;        ori.b    #$40,$BFEE01
  3285.  
  3286.         MOVEQ.L    #2,D3
  3287. .4        MOVE.L    D1,-(A7)
  3288.         MOVE.B    $DFF006,D1
  3289. .3        CMP.B    $DFF006,D1
  3290.         BEQ.S    .3
  3291.         MOVE.L    (A7)+,D1
  3292.         DBF    D3,.4
  3293.  
  3294.         moveq    #0,D4
  3295.         not.b    D2
  3296.         ror.b    #1,D2
  3297.  
  3298.         MOVE.B    D2,KBDVAL
  3299.  
  3300.         cmpi.b    #$78,D2
  3301.         bne.s    lbC000078
  3302.  
  3303.         illegal
  3304.     ifeq    1
  3305.         bset    #0,$134(A6)
  3306.         beq.s    lbC00007E
  3307.         bset    #1,$134(A6)
  3308.         bne.w    lbC00012E
  3309.         movea.l    $124(A6),A1
  3310.         tst.l    (A1)
  3311.         beq.w    lbC00012C
  3312. lbC00005E
  3313.         move.l    (A1),D3
  3314.         beq.w    lbC00012E
  3315.         addq.w    #1,$132(A6)
  3316.         move.l    A6,-(SP)
  3317.         movea.l    $24(A6),A6
  3318.         jsr    -$B4(A6)
  3319.         movea.l    (SP)+,A6
  3320.         movea.l    D3,A1
  3321.         bra.s    lbC00005E
  3322.     endc
  3323. lbC000078
  3324.         bclr    #0,$134(A6)
  3325. lbC00007E
  3326.         move.w    D2,D1
  3327.         andi.w    #$7F,D1
  3328.         cmpi.w    #$71,D1
  3329.         bhi.w    lbC0000EA
  3330.         move.w    D1,D0
  3331.         andi.w    #7,D0
  3332.         lsr.w    #3,D1
  3333.         lea    $136(A6),A0
  3334.         btst    #7,D2
  3335.         bne.s    lbC0000AE
  3336.         bset    D0,0(A0,D1.W)
  3337.         cmpi.w    #12,D1
  3338.         bne.s    lbC0000CE
  3339.         bset    D0,$135(A6)
  3340.         bra.s    lbC0000CE
  3341. lbC0000AE
  3342.         bclr    D0,0(A0,D1.W)
  3343.         cmpi.w    #12,D1
  3344.         bne.s    lbC0000CE
  3345.         bclr    D0,$135(A6)
  3346.         bra.s    lbC0000CE
  3347. lbW0000BE
  3348.         dc.w    $80,$E0,$E0,$F0,$804,$7C,0,0
  3349. lbC0000CE
  3350.         move.w    D2,D1
  3351.         andi.w    #$7F,D1
  3352.         move.w    D1,D0
  3353.         andi.w    #7,D0
  3354.         lsr.w    #3,D1
  3355.         lea    lbW0000BE(PC),A0
  3356.         btst    D0,0(A0,D1.W)
  3357.         beq.s    lbC0000EA
  3358.         ori.w    #$100,D4
  3359. lbC0000EA
  3360.         move.w    $72(A6),D1
  3361.         move.w    D1,D0
  3362.         addq.w    #4,D0
  3363.         andi.w    #$7F,D0
  3364.         cmp.w    $70(A6),D0
  3365.         bne.s    lbC000108
  3366.         move.w    D1,D0
  3367.         move.w    #$7D,D2
  3368.         subq.w    #4,D1
  3369.         andi.w    #$7F,D1
  3370. lbC000108
  3371.         move.w    D2,$74(A6,D1.W)
  3372.         or.b    $135(A6),D4
  3373.         move.w    D4,$76(A6,D1.W)
  3374.         move.w    D0,$72(A6)
  3375. ;        btst    #0,$3D(A6)
  3376. ;        bne.s    lbC00012C
  3377. ;        movea.l    $48(A6),A1
  3378. ;        tst.l    (A1)
  3379. ;        beq.s    lbC00012C
  3380. ;        bsr.l    *-$FFFF0278
  3381. ;lbC00012C
  3382.  
  3383.         MOVE.B    #$1,$BFEE01
  3384.  
  3385. ;        andi.b    #$BF,$BFEE01
  3386.  
  3387. lbC00012E
  3388.         MOVE.B    KBDVAL,d0
  3389.         TST.L    OSM_SLVTRAINER
  3390.         BEQ.S    .NOTRAINER
  3391.         MOVE.L    OSM_SLVTRAINER(PC),A0
  3392.         JSR    (A0)
  3393. .NOTRAINER
  3394.         MOVE.B    D0,KBDVAL
  3395.         BEQ.S    .1
  3396.         move.l    (_Slave),a0
  3397.         CMP.B    (ws_keyexit,a0),D0
  3398.         BEQ.S    .QUIT
  3399. .1
  3400.         movem.l    (SP)+,D2-D4/A6
  3401.         move.l    _inputhandler(PC),d0
  3402.         bne    _InputHandlerPI
  3403.         rts
  3404.  
  3405. .QUIT        PEA    TDREASON_OK
  3406.         MOVE.L    _RESLOAD(PC),-(A7)
  3407.         add.l    #resload_Abort,(a7)
  3408.         rts
  3409.  
  3410. ADDICRV        lsl.w    #2,d0
  3411.         move.l    (a6,d0.w),d1
  3412.         bne    .1
  3413.         move.l    a1,(a6,d0.w)
  3414. .1        move.l    d1,d0
  3415.         rts
  3416.  
  3417. REMICRV        lsl.w    #2,d0
  3418.         cmp.l    (a6,d0.w),a1
  3419.         bne    .1
  3420.         clr.l    (a6,d0.w)
  3421. .1        rts
  3422.  
  3423.  
  3424.  
  3425. INT_CIAA    move.l    _ciaabase,a6
  3426.         MOVE.B    $BFED01,D0
  3427. INT_CIA
  3428. .chk        Bclr    #0,D0
  3429.         BNE.S    .ta
  3430.         Bclr    #1,D0
  3431.         BNE.S    .tb
  3432.         Bclr    #2,D0
  3433.         BNE.S    .alarm
  3434.         Bclr    #3,D0
  3435.         BNE.S    .sp
  3436.         Bclr    #4,D0
  3437.         BNE.S    .flag
  3438.         RTS
  3439.  
  3440. .ta        MOVE.L    (A6),A0
  3441.         BRA.S    .IN
  3442. .tb        MOVE.L    (4,A6),A0
  3443.         BRA.S    .IN
  3444. .alarm        MOVE.L    (8,A6),A0
  3445.         BRA.S    .IN
  3446. .sp        MOVE.L    (12,A6),A0
  3447.         BRA.S    .IN
  3448. .flag        MOVE.L    (16,A6),A0
  3449.  
  3450. .IN        move.l    a0,d1
  3451.         beq    .chk
  3452.         MOVE.L    (IS_DATA,A0),A1
  3453.         MOVE.L    (IS_CODE,A0),A0
  3454.         movem.l    d0/a6,-(a7)
  3455.         Jsr    (A0)
  3456.         movem.l    (a7)+,d0/a6
  3457.         bra    .chk
  3458.  
  3459. **************************************************************************
  3460. *   CIAB.RESOURCE                                                        *
  3461. **************************************************************************
  3462.  
  3463. CIABINIT    move.l    _ciabbase,d0
  3464.         beq    .init
  3465.         rts
  3466.  
  3467. .init        move.l    #-_LVOSetICR,d0
  3468.         move.l    #5*4,d1
  3469.         lea    _ciabname,a0
  3470.         bsr    _InitStruct
  3471.         move.l    d0,a0
  3472.         move.l    d0,_ciabbase
  3473.  
  3474.         patch    _LVOAddICRVector(a0),ADDICRV(pc)
  3475.         patch    _LVORemICRVector(a0),REMICRV(pc)
  3476.         
  3477.         clr.l    (a0)+
  3478.         clr.l    (a0)+
  3479.         clr.l    (a0)+
  3480.         clr.l    (a0)+
  3481.         clr.l    (a0)
  3482.  
  3483.         MOVE.B    #$FF,$BFD500
  3484.         MOVE.B    #$FF,$BFD700
  3485.  
  3486.         rts
  3487.  
  3488. INT_CIAB    move.l    _ciabbase,a6
  3489.         MOVE.B    $BFDD00,D0
  3490.         bra    INT_CIA
  3491.  
  3492. **************************************************************************
  3493. **************************************************************************
  3494.  
  3495.     INCLUDE    dos.s
  3496.     INCLUDE    freeanim.s
  3497.     INCLUDE    nonvolatile.s
  3498.     INCLUDE    graphics.s
  3499.     INCLUDE    intuition.s
  3500.     INCLUDE    lowlevel.s
  3501.     INCLUDE    mathffp.s
  3502.     INCLUDE    mathtrans.s
  3503.  
  3504. **************************************************************************
  3505. **************************************************************************
  3506. *   CHIPMEMORYTABLE AND MEMORY MANAGEMENT DATA                           *
  3507. **************************************************************************
  3508.  
  3509. ;THIS HAS TO BE ABSOLUTELY THE LAST LABEL, THE TABLE HAS A LEN DEPENDING
  3510. ;  FROM THE SIZE OF THE MEMORY
  3511.     DC.B    'OSEMUEND'
  3512.     CNOP    0,8
  3513. _osemu_end
  3514. ALLOCMTAB
  3515.  
  3516.